Skip to main content
IBM Quantum Platform

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:

Output of the previous code cell

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:

Output of the previous code cell

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á especificar target ou qualquer outra opção de backend. Da mesma forma, se você especificar target, não precisará especificar backend ou 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, como coupling_map, ela substituirá as configurações de backend.
    • 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 de backend.
    • 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 executando backend.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_constraints será None e 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 for None, 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 for None, será usado o instruction_schedule_map da 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 opcional HLSConfig que é passada diretamente para a passagem de transformação HighLevelSynthesis . 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 executando list_stage_plugins() com init como 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 executando unitary_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 argumento unitary_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 as coupling_map restriçõ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, sabre e trivial). 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 executando list_stage_plugins() com layout como argumento stage_name . O valor padrão é sabre.
    • routing_method (str) - Nome do passe de roteamento (basic, lookahead, default, sabre ou none). 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 executando list_stage_plugins() com routing como argumento stage_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 executando list_stage_plugins() com translation como argumento stage_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. Especificar None define 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 executando list_stage_plugins() com optimization como argumento stage_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 executando list_stage_plugins() com scheduling como argumento stage_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.
    • 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

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