Configurações padrão e opções de configuração da transpilação
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
Os circuitos abstratos precisam ser transpilados porque as QPUs têm um conjunto limitado de portas de base e não podem executar operações arbitrárias. A função do transpilador é alterar circuitos arbitrários para que eles possam ser executados em uma QPU especificada. Isso é feito traduzindo os circuitos para as portas de base suportadas e introduzindo portas SWAP conforme necessário, de modo que a conectividade do circuito corresponda à da QPU.
Conforme explicado em Transpile com gerenciadores de passagem, você pode criar um gerenciador de passagem usando a função generate_preset_pass_manager e passar um circuito ou uma lista de circuitos para seu método de execução para transpilá-los. Você pode chamar generate_preset_pass_manager passando apenas o nível de otimização e o backend, optando por usar os padrões para todas as outras opções, ou pode passar argumentos adicionais para a função para ajustar a transpilação.
Utilização básica sem parâmetros
Neste exemplo, passamos um circuito e uma QPU de destino para o transpilador sem especificar nenhum parâmetro adicional.
Crie um circuito e veja o resultado:
from qiskit import QuantumCircuit
from qiskit.circuit.library import grover_operator, DiagonalGate
from qiskit_ibm_runtime.fake_provider import FakeSherbrooke
# Create circuit to test transpiler on
oracle = DiagonalGate([1] * 7 + [-1])
qc = QuantumCircuit(3)
qc.h([0, 1, 2])
qc = qc.compose(grover_operator(oracle))
# Add measurements to the circuit
qc.measure_all()
# View the circuit
qc.draw(output="mpl")Output:
Transpile o circuito e veja o resultado:
from qiskit.transpiler import generate_preset_pass_manager
# Specify the QPU to target
backend = FakeSherbrooke()
# Transpile the circuit
pass_manager = generate_preset_pass_manager(
optimization_level=1, backend=backend
)
transpiled_circ = pass_manager.run(qc)
# View the transpiled circuit
transpiled_circ.draw(output="mpl", idle_wires=False)Output:
Todos os parâmetros disponíveis
A seguir estão todos os parâmetros disponíveis para a função generate_preset_pass_manager função. Há duas classes de argumentos: aqueles que descrevem o alvo da compilação e aqueles que influenciam o funcionamento do transpilador.
Todos os parâmetros, exceto optimization_level , são opcionais. Para obter detalhes completos, consulte a documentação da API do Transpiler.
optimization_level(int) - O grau de otimização a ser executado nos circuitos. Número inteiro no intervalo (0 - 3). Níveis mais altos geram circuitos mais otimizados, à custa de um tempo de transpilação mais longo. Consulte Definir o nível de otimização do transpilador para obter mais detalhes.
Parâmetros usados para descrever o destino da compilação:
Esses argumentos descrevem a QPU de destino para a execução do circuito, incluindo informações como o mapa de acoplamento da QPU (que descreve a conectividade dos qubits), as portas de base suportadas pela QPU e as taxas de erro das portas.
Muitos desses parâmetros são descritos em detalhes em Parâmetros comumente usados para transpilação.
Parâmetros de backend - Se você especificar
backend, não precisará especificartargetou qualquer outra opção de backend. Da mesma forma, se você especificartarget, não precisará especificarbackendou qualquer outra opção de backend.backend(Backend) - Se isso for definido, o transpilador compila o circuito de entrada para esse dispositivo. Se for definida qualquer outra opção que afete essas configurações, comocoupling_map, ela substituirá as configurações debackend.target(Target) - Um alvo do transpilador de backend. Normalmente, isso é especificado como parte do argumento de backend, mas se você construiu manualmente um objeto Target, poderá especificá-lo aqui. Isso substitui o alvo debackend.backend_properties( BackendProperties ) - Propriedades retornadas por uma QPU, incluindo informações sobre erros de porta, erros de leitura, tempos de coerência de qubit e assim por diante. Encontre uma QPU que forneça essas informações executandobackend.properties().timing_constraints(Dictstr[, int] | None) - Uma restrição de hardware de controle opcional na resolução de tempo da instrução. Essas informações são fornecidas pela configuração da QPU. Se a QPU não tiver nenhuma restrição na alocação do tempo de instrução,timing_constraintsseráNonee nenhum ajuste será realizado. Uma QPU pode informar um conjunto de restrições, a saber:granularity: Um valor inteiro que representa a resolução mínima da porta de pulso em unidades de dt. Uma porta de pulso definida pelo usuário deve ter uma duração que seja um múltiplo desse valor de granularidade.min_length: Um valor inteiro que representa o comprimento mínimo da porta de pulso em unidades de dt. Uma porta de pulso definida pelo usuário deve ser maior que esse comprimento.pulse_alignment: Um valor inteiro que representa uma resolução de tempo da hora de início da instrução de porta. As instruções do gate devem começar em um momento que seja um múltiplo desse valor.acquire_alignment: Um valor inteiro que representa uma resolução de tempo da hora de início da instrução de medição. A instrução de medição deve começar em um horário que seja um múltiplo desse valor.
basis_gates( [Liststr] | None) - Lista de nomes de portas de base para as quais desenrolar. Por exemplo [' u1 ', ' u2 ', ' u3 ', 'cx']. Se forNone, não desenrole.coupling_map( CouplingMap | List[ [Listint] ]) - Mapa de acoplamento direcionado (possivelmente personalizado) para o destino no mapeamento. Se o mapa de acoplamento for simétrico, ambas as direções precisarão ser especificadas. Esses formatos são compatíveis:- CouplingMap instância
- Lista - deve ser fornecida como uma matriz de adjacência, em que cada entrada especifica todas as interações direcionadas de dois qubits compatíveis com a QPU. Por exemplo: [[0, 1], [0, 3], [1, 2], [1, 5], [2, 5], [4, 1], [5, 3] ]
inst_map( [ListInstructionScheduleMap] | None) - Mapeamento das operações do circuito para programações de pulso. Se forNone, será usado oinstruction_schedule_mapda QPU.
Parâmetros usados para influenciar o funcionamento do transpiler
Esses parâmetros afetam estágios específicos de transpilação. Alguns deles podem afetar vários estágios, mas foram listados em apenas um estágio para simplificar. Se você especificar um argumento, como initial_layout para os qubits que deseja usar, esse valor substituirá todas as passagens que poderiam alterá-lo. Em outras palavras, o transpilador não alterará nada que você especificar manualmente. Para obter detalhes sobre estágios específicos, consulte Estágios do transpiler.
hls_config(HLSConfig) - Uma classe de configuração opcionalHLSConfigque é passada diretamente para a passagem de transformaçãoHighLevelSynthesis. Essa classe de configuração permite especificar as listas de algoritmos de síntese e seus parâmetros para vários objetos de alto nível.init_method(str) - O nome do plug-in a ser usado no estágio de inicialização. Por padrão, um plug-in externo não é usado. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()cominitcomo argumento do nome do estágio.unitary_synthesis_method(str) - O nome do método de síntese unitária a ser usado. Por padrão,defaulté usado. Você pode ver uma lista dos plug-ins instalados executandounitary_synthesis_plugin_names().unitary_synthesis_plugin_config(dict) - Um dicionário de configuração opcional que é passado diretamente para o plug-in de síntese unitária. Por padrão, essa configuração não tem efeito, pois o método de síntese unitária padrão não requer configuração personalizada. A aplicação de uma configuração personalizada só deve ser necessária quando um plug-in de síntese unitária for especificado com o argumentounitary_synthesis. Como isso é personalizado para cada plug-in de síntese unitária, consulte a documentação do plug-in para saber como usar essa opção.
initial_layout(Layout | Dict | Lista) - Posição inicial dos qubits virtuais nos qubits físicos. Se esse layout tornar o circuito compatível com ascoupling_maprestrições, ele será utilizado. Não é garantido que o layout final seja o mesmo, pois o transpiler pode permutar qubits por meio de trocas ou outros meios. Para obter detalhes completos, consulte a seção Layout inicial.layout_method(str) - Nome da passagem de seleção de layout (default,dense,sabreetrivial). Esse também pode ser o nome do plug-in externo a ser usado no estágio de layout. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()comlayoutcomo argumentostage_name. O valor padrão ésabre.
routing_method(str) - Nome do passe de roteamento (basic,lookahead,default,sabreounone). Esse também pode ser o nome do plug-in externo a ser usado no estágio de roteamento. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()comroutingcomo argumentostage_name. O valor padrão ésabre.
translation_method(str) - Nome da etapa de tradução (default,synthesis,translator,ibm_backend,ibm_dynamic_circuits,ibm_fractional) Esse também pode ser o nome do plug-in externo a ser usado na etapa de tradução. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()comtranslationcomo argumentostage_name. O valor padrão étranslator.
approximation_degree(float, no intervalo 0-1 | None) - Marcador heurístico usado para aproximação do circuito ( 1.0 = nenhuma aproximação, 0.0 = aproximação máxima). O valor padrão é 1.0. EspecificarNonedefine o grau de aproximação para a taxa de erro relatada. Consulte a seção Grau de aproximação para obter mais detalhes.optimization_method(str) - O nome do plug-in a ser usado para o estágio de otimização. Por padrão, um plug-in externo não é usado. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()comoptimizationcomo argumentostage_name.
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. Você pode ver uma lista dos plug-ins instalados executandolist_stage_plugins()comschedulingcomo argumentostage_name.- 'as_soon_as_possible': Programar instruções com avidez, o mais cedo possível em um recurso de qubit (alias:
asap). - 'as_late_as_possible': Programar as instruções com atraso, ou seja, manter os qubits no estado fundamental quando possível (alias:
alap). Esse é o padrão.
- 'as_soon_as_possible': Programar instruções com avidez, o mais cedo possível em um recurso de qubit (alias:
seed_transpiler(int) - Define sementes aleatórias para as partes estocásticas do transpilador.
Os valores padrão a seguir serão usados se você não especificar nenhum dos parâmetros acima. Consulte a página de referência da API do método para obter mais informações:
generate_preset_pass_manager(
optimization_level=1,
backend=None,
target=None,
basis_gates=None,
coupling_map=None,
initial_layout=None,
layout_method=None,
routing_method=None,
translation_method=None,
scheduling_method=None,
approximation_degree=1.0,
seed_transpiler=None,
unitary_synthesis_method="default",
unitary_synthesis_plugin_config=None,
hls_config=None,
init_method=None,
optimization_method=None,
)Output:
<qiskit.transpiler.passmanager.StagedPassManager at 0x7f0bfe29df90>
Próximas etapas
- Saiba como definir o nível de otimização.
- Revisar mais Parâmetros comumente usados.
- Saiba como definir o nível de otimização ao usar o Qiskit Runtime.
- Acesse o tópico “Transpile com gerenciadores de passes ”.
- Para exemplos, consulte Representando computadores quânticos.
- Aprenda a transpilá-los como parte do fluxo de trabalho dos padrões Qiskit usando Qiskit Runtime.
- Consulte a documentação da API do Transpile.