PadDynamicalDecoupling
class qiskit.transpiler.passes.PadDynamicalDecoupling(*args, **kwargs)
Bases: BasePadding
Passe de inserção de desacoplamento dinâmico.
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 equivalem à 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.
Como um caso especial, o passe 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 atraso por algo 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, Target, CouplingMap
from qiskit.transpiler.passes import ALAPScheduleAnalysis, PadDynamicalDecoupling
from qiskit.visualization import timeline_drawer
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)],
dt=1e-7
)
target = Target.from_configuration(
["h", "cx", "reset", "x", "measure"],
num_qubits=4,
coupling_map=CouplingMap.from_line(4, bidirectional=False),
instruction_durations=durations,
dt=1e-7,
)
# balanced X-X sequence on all qubits
dd_sequence = [XGate(), XGate()]
pm = PassManager([ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence)])
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)
# 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
spacing = []
for k in range(n):
spacing.append(uhrig_pulse_location(k) - sum(spacing))
spacing.append(1 - sum(spacing))
pm = PassManager(
[
ALAPScheduleAnalysis(durations),
PadDynamicalDecoupling(durations, dd_sequence, qubits=[0], spacing=spacing),
]
)
circ_dd = pm.run(circ)
timeline_drawer(circ_dd, target=target)

Talvez seja necessário chamar a passagem de alinhamento antes de executar o desacoplamento dinâmico para garantir que o circuito satisfaça as restrições de alinhamento de aquisição.
Inicializador de desacoplamento dinâmico.
Parâmetros
-
durations (durações) - Durações das instruções a serem usadas no agendamento.
-
dd_sequence - Sequência de portas a serem aplicadas em pontos ociosos.
-
qubits - Qubits físicos nos quais aplicar o DD. Se for None, todos os qubits serão submetidos a DD (quando possível).
-
espaçamento - Uma lista de espaçamentos entre as portas 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].
-
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_alignmentfor 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 extra da forma mais homogênea possível em intervalos no início e no final da sequência.
-
alvo - O
Targetque representa o backend de destino. O alvo tem precedência sobre outros argumentos quando eles podem ser inferidos a partir do alvo. Portanto, especificar o alvo e outros argumentos comodurationsoupulse_alignmentfará com que esses outros argumentos sejam ignorados.
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.
- TypeError - Se
dd_sequencenão for especificado
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
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 ]
get_duration
name
run
run(dag)
Execute o passe de preenchimento em dag.
Parâmetros
dag (DAGCircuit) – DAG a ser verificado.
Retorna
DAG com tempo ocioso preenchido com instruções.
Tipo de retorno
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.
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