Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

class qiskit.transpiler.passes.PadDynamicalDecoupling(*args, **kwargs)

GitHub

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)
Saída do código anterior.Saída do código anterior.
Nota

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_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 extra da forma mais homogênea possível em intervalos no início e no final da sequência.
  • alvo - O Target que 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 como durations ou pulse_alignment fará 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_sequence nã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)

GitHub

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

get_duration(node, dag)

GitHub

Obter a duração de um determinado nó no circuito.

name

name()

GitHub

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.

Tipo de retorno

DAGCircuit

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)

GitHub

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.