Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

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

GitHub

베이스: BasePadding

동적 디커플링 삽입 패스.

이 패스는 예약된 물리적 회로에서 작동합니다. 회로를 스캔하여 유휴 시간(즉, 지연 명령이 포함된 시간)이 있는지 확인하고 해당 지점에 DD 시퀀스 게이트를 삽입합니다. 이러한 게이트는 아이덴티티에 해당하므로 회로의 논리적 동작을 변경하지는 않지만 유휴 기간의 디코히어런스를 완화하는 효과가 있습니다.

특별한 경우로, 패스는 length-1 시퀀스(예: [XGate()])를 허용합니다. 이 경우 DD 삽입은 게이트 역이 회로의 인접 게이트에 흡수될 수 있을 때만 발생합니다(따라서 여전히 지연을 동일성과 동일한 것으로 대체하게 됩니다). 예를 들어 한 에코로 사용할 수 있습니다.

이 패스는 삽입된 시퀀스가 회로를 정확하게 보존하도록 합니다(전역 위상 포함).

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)
이전 코드의 출력입니다.이전 코드의 출력입니다.
참고

동적 디커플링을 실행하기 전에 얼라인먼트 패스를 호출하여 회로가 획득 얼라인먼트 제약 조건을 충족하는지 확인해야 할 수 있습니다.

동적 디커플링 이니셜라이저.

매개변수

  • 기간 - 스케줄링에 사용할 지침의 기간입니다.

  • dd_sequence - 유휴 지점에 적용할 게이트의 시퀀스입니다.

  • 큐비트 - DD를 적용할 물리적 큐비트입니다. 없음이면 모든 큐비트가 DD를 거칩니다(가능한 경우).

  • 간격 - DD 게이트 사이의 간격 목록입니다. 이에 따라 사용 가능한 여유 공간이 나뉩니다. 목록 길이는 dd_sequence의 길이보다 하나 더 길어야 하며 요소의 합계가 1이어야 합니다. None인 경우 균형 잡힌 간격이 사용됩니다 [. d/2, d, d, …, d, d, d/2].

  • skip_reset_qubits - True이면 초기화/리셋 큐비트 직후의 유휴 기간에 DD를 삽입하지 않습니다(접지 상태의 큐비트는 디코히어런스에 덜 민감하므로).

  • pulse_alignment - 게이트 타이밍 할당을 위한 하드웨어 제약 조건입니다. 이는 일반적으로 backend.configuration().timing_constraints 에서 제공됩니다. 제공된 경우 지연 길이(예: spacing, 는 이 제약 조건을 충족하도록 암시적으로 조정됩니다.

  • 추가_슬랙_분배

    DD 시퀀스 생성 동작을 제어하는 옵션입니다. DD 시퀀스의 지속 시간은 예약된 양자 회로의 유휴 시간과 동일해야 하지만, 시퀀스를 구성하는 게이트 사이의 지연은 dt 단위의 정수여야 하며 pulse_alignment 을 지정하면 더 잘릴 수 있습니다. 이로 인해 생성된 시퀀스의 길이가 시퀀스로 채우려는 유휴 시간보다 짧아지는 경우, 즉 여분의 여유가 생기는 경우가 있습니다. 이 옵션은 다음 값을 사용합니다.

    • "중간": 시퀀스 중간 간격에 여분의 여유를 둡니다.
    • "가장자리": 여분의 여백을 시퀀스의 시작과 끝에서 가능한 한 균등하게 간격으로 나눕니다.
  • 대상 - 대상 백엔드를 나타내는 Target 대상 백엔드를 나타냅니다. 타깃에서 다른 인수를 유추할 수 있는 경우 타깃이 다른 인수보다 우선합니다. 따라서 대상과 durations 또는 pulse_alignment 같은 다른 인수를 함께 지정하면 다른 인수는 무시됩니다.

레이즈

  • TranspilerError – 유효하지 않은 DD 시퀀스가 지정된 경우.
  • TranspilerError – 정렬 제약 조건 값의 배수가 아닌 지속 시간을 가진 펄스 게이트가 발견될 때.
  • TypeError - dd_sequence 을 지정하지 않은 경우

속성

is_analysis_pass

패스가 분석 패스인지 확인합니다.

패스가 AnalysisPass, 인 경우 패스가 DAG를 분석하고 해당 분석 결과를 속성 집합에 쓸 수 있음을 의미합니다. 이러한 종류의 패스에서는 DAG에 대한 수정이 허용되지 않습니다.

is_transformation_pass

패스가 변환 패스인지 확인합니다.

패스가 TransformationPass, 인 경우 패스가 DAG를 조작할 수는 있지만 속성 집합을 수정할 수는 없음을 의미합니다(단, 읽을 수는 있음).


메소드

execute

execute(passmanager_ir, state, callback=None)

GitHub

입력된 키스킷 IR에 대한 최적화 작업을 실행합니다.

매개변수

  • passmanager_ir (DAGCircuit) – 최적화할 Qiskit IR.
  • state (DAGCircuit) – 패스 관리자 자체에 의한 워크플로 실행과 관련된 상태.
  • callback (Callable[[Task, DAGCircuit, PropertySet, float, int], None] | None) – 최적화 작업이 실행될 때마다 호출되는 콜백 함수입니다.

리턴

최적화된 키스킷 IR 및 워크플로 상태.

리턴 유형

튜플 [ DAGCircuit, PassManagerState ]

get_duration

get_duration(node, dag)

GitHub

회로에서 지정된 노드의 지속 시간을 가져옵니다.

name

name()

GitHub

패스 이름.

리턴 유형

str

run

run(dag)

GitHub

dag 에서 패딩 패스를 실행합니다.

매개변수

dag (DAGCircuit) – DAG를 확인합니다.

리턴

지침으로 가득 찬 유휴 시간이 있는 DAG.

리턴 유형

DAGCircuit

레이즈

TranspilerError – 특정 노드가 스케줄링되지 않은 경우, 해당 노드가 호출되기 전에 어떤 변환 단계가 삽입된 것일 가능성이 높습니다.

update_status

update_status(state, run_state)

GitHub

워크플로 상태를 업데이트합니다.

매개변수

  • state (PassManagerState) – 관리자 상태를 전달하여 업데이트합니다.
  • run_state (RunState) – 현재 작업의 완료 상태입니다.

리턴

패스 관리자 상태가 업데이트되었습니다.

리턴 유형

PassManagerState

이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.