Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

class PadDynamicalDecoupling(*args, **kwargs)

GitHub

Bases: BlockBasePadder

Passe de inserção de desacoplamento dinâmico para IBM backends de circuitos dinâmicos.

Essa passagem funciona em um circuito físico programado. Ele examina o circuito em busca de períodos de tempo ociosos (ou seja, aqueles que contêm instruções de atraso) e insere uma sequência DD de portas nesses pontos. Essas portas correspondem à identidade, portanto não alteram a ação lógica do circuito, mas têm o efeito de atenuar a decoerência nesses períodos ociosos. Em um caso especial, a passagem permite uma sequência length-1 (por exemplo, [XGate()] ). Nesse caso, a inserção do DD ocorre somente quando o inverso da porta pode ser absorvido em uma porta vizinha no circuito (portanto, ainda estaríamos substituindo o Delay por algo que é equivalente à identidade). Isso pode ser usado, por exemplo, como um eco de Hahn. Essa passagem garante que a sequência inserida preserve exatamente o circuito (incluindo a fase global).

import numpy as np
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import XGate
from qiskit.transpiler import PassManager, InstructionDurations
from qiskit.visualization import timeline_drawer

from qiskit_ibm_runtime.transpiler.passes.scheduling import ALAPScheduleAnalysis
from qiskit_ibm_runtime.transpiler.passes.scheduling import PadDynamicalDecoupling

circ = QuantumCircuit(4)
circ.h(0)
circ.cx(0, 1)
circ.cx(1, 2)
circ.cx(2, 3)
circ.measure_all()
durations = InstructionDurations(
    [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10),
     ("cx", [1, 2], 200), ("cx", [2, 3], 300),
     ("x", None, 50), ("measure", None, 1000)]
)

# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
                  PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
Diagrama de circuito gerado pelo código anterior.
# Uhrig sequence on qubit 0
n = 8
dd_sequence = [XGate()] * n
def uhrig_pulse_location(k):
    return np.sin(np.pi * (k + 1) / (2 * n + 2)) ** 2
spacings = []
for k in range(n):
    spacings.append(uhrig_pulse_location(k) - sum(spacings))
spacings.append(1 - sum(spacings))
pm = PassManager(
    [
        ALAPScheduleAnalysis(durations),
        PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacings=spacings),
    ]
)
circ_dd = pm.run(circ)
circ_dd.draw('mpl', style="iqp")
Diagrama de circuito gerado pelo código anterior.
Nota

Você precisa chamar ALAPScheduleAnalysis antes de executar o desacoplamento dinâmico para garantir que seu circuito satisfaça as restrições de alinhamento de aquisição para backends de circuitos dinâmicos.

Parâmetros

  • durations (durações) - Durações das instruções a serem usadas no agendamento.

  • dd_sequences - Sequência de portas a serem aplicadas em pontos ociosos. Como alternativa, pode ser fornecida uma lista de sequências de portas que serão inseridas preferencialmente se houver um atraso de duração suficiente. Isso pode ser ajustado pelo site sequence_min_length_ratios, fornecido opcionalmente.

  • qubits - Qubits físicos nos quais aplicar o DD. Se for None, todos os qubits serão submetidos a DD (quando possível).

  • espaçamentos - Uma lista de listas de espaçamentos entre os portões DD. A folga disponível será dividida de acordo com isso. O comprimento da lista deve ser um a mais do que o comprimento de dd_sequence, e os elementos devem somar 1. Se Nenhum, um espaçamento balanceado será usado [d/2, d, d, …, d, d, d/2]. Esse espaçamento só se aplica ao primeiro subcircuito, se for especificado um coupling_map

  • skip_reset_qubits - Se for true, não insere DD em períodos ociosos que seguem imediatamente os qubits inicializados/reinicializados (já que os qubits no estado fundamental são menos suscetíveis à decoerência).

  • pulse_alignment - As restrições de hardware para alocação de tempo de porta. Isso geralmente é fornecido pelo site backend.configuration().timing_constraints. Se fornecido, o comprimento do atraso, ou seja, spacing, é ajustado implicitamente para satisfazer essa restrição.

  • extra_slack_distribuição -

    A opção para controlar o comportamento da geração da sequência DD. A duração da sequência DD deve ser idêntica a um tempo ocioso no circuito quântico programado; no entanto, o atraso entre as portas que compõem a sequência deve ser um número inteiro em unidades de dt, e pode ser ainda mais truncado quando pulse_alignment for especificado. Isso às vezes faz com que a duração da sequência criada seja menor do que o tempo ocioso que você deseja preencher com a sequência, ou seja, uma folga extra. Essa opção assume os seguintes valores.

    • "meio": Coloque a folga extra no intervalo no meio da sequência.

    • ”bordas”: Divida a folga excedente da forma mais uniforme possível em

      intervalos no início e no final da sequência.

  • sequence_min_length_ratios - Lista da relação entre o comprimento mínimo do atraso e a sequência DD que deve ser satisfeita para inserir a sequência DD. Por exemplo, se a sequência de desacoplamento dinâmico X-X tiver 320dt amostras e o atraso disponível for 384dt, ela terá uma proporção de 384dt/320dt=1.2. Do ponto de vista do desacoplamento dinâmico, é provável que isso adicione mais ruído de controle do que reduções na taxa de erro de desacoplamento. O valor padrão é 2.0.

  • insert_multiple_cycles - Se a duração disponível exceder 2*sequence_min_length_ratio*duration(dd_sequence ), habilite a inserção de várias rodadas da sequência de desacoplamento dinâmico nesse atraso.

  • coupling_map - gráfico direcionado que representa o mapa de acoplamento do dispositivo. A especificação de um mapa de acoplamento divide o dispositivo em subcircuitos, a fim de aplicar sequências DD com diferentes espaçamentos de pulso em cada um deles. Atualmente, suporta 2 subcircuitos.

  • alt_spacings - Uma lista de listas de espaçamentos entre os portões DD, para o segundo subcircuito, conforme determinado pelo mapa de acoplamento. Se for None (Nenhum), será usado um espaçamento equilibrado que é escalonado em relação ao primeiro subcircuito [d, d, d,..., d, d, d, 0].

  • schedule_idle_qubits - Defina como true se quiser que seja inserido um atraso nos qubits ociosos. Isso é útil para visualizações de linha do tempo, mas pode causar problemas de execução em backends grandes.

  • dd_barrier - aplica DD somente a atrasos que terminam com uma barreira cujo rótulo contém a string especificada

  • block_ordering_callable - Um callable usado para produzir uma ordenação dos nós para minimizar o número de blocos necessários. Se não for fornecido, será usado o endereço block_order_op_nodes() .

  • destino – O destino de compilação do backend.

Aumentos

  • TranspilerError - Quando uma sequência DD inválida é especificada.
  • TranspilerError - Quando a porta de pulso com a duração que não é múltipla do valor de restrição de alinhamento é encontrada.
  • TranspilerError - Quando o mapa de acoplamento não for compatível (ou seja, se o grau for > 3)

Atributos

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

__call__

__call__(circuit, property_set=None)

Executa o circuito de passagem.

Parâmetros

  • circuit (QuantumCircuit) – O dia em que a passagem é executada.
  • property_set (PropertySet | dict | None) – Conjunto de propriedades de entrada/saída. Uma passagem de análise pode alterar a propriedade definida no local. Se não for fornecido, será utilizado o atributo property_set existente do passe (se definido).

Retorna

Se uma transformação for bem-sucedida, o resultado será QuantumCircuit. Se a análise for aprovada, o circuito de entrada.

Tipo de retorno

QuantumCircuit

execute

execute(passmanager_ir, state, callback=None)

Executar a tarefa de otimização para a entrada Qiskit IR.

Parâmetros

  • passmanager_ir (DAGCircuit) – Qiskit IR para otimização.
  • state (DAGCircuit) – Estado associado à execução do fluxo de trabalho pelo próprio gerenciador de passagens.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | 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[ DAGCircuit, PassManagerState ]

name

name()

Nome do passe.

Tipo de retorno

str

run

run(dag)

GitHub

Execute o passe de preenchimento em dag.

Parâmetros

dag (DAGCircuit) – DAG a ser verificado.

Retorna

DAG com tempo ocioso preenchido com instruções.

Aumentos

TranspilerError - Quando um determinado nó não está programado, é provável que alguma passagem de transformação seja inserida antes que esse nó seja chamado.

Tipo de retorno

DAGCircuit

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

PassManagerState

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