Skip to main content
IBM Quantum Platform

PadDynamicalDecoupling

class PadDynamicalDecoupling(*args, **kwargs)

GitHub

베이스: BlockBasePadder

IBM 동적 회로 백엔드용 동적 디커플링 삽입 패스.

이 패스는 예약된 물리적 회로에서 작동합니다. 회로를 스캔하여 유휴 시간(즉, 지연 명령이 포함된 시간)이 있는지 확인하고 해당 지점에 DD 시퀀스 게이트를 삽입합니다. 이러한 게이트는 아이덴티티에 해당하므로 회로의 논리적 동작을 변경하지는 않지만 유휴 기간의 비일관성을 완화하는 효과가 있습니다. 특수한 경우로, 패스는 length-1 시퀀스(예: [XGate()] )를 허용합니다. 이 경우 DD 삽입은 게이트 역이 회로의 인접 게이트에 흡수될 수 있을 때만 발생합니다(따라서 여전히 Delay를 동일성과 동등한 것으로 대체합니다). 예를 들어 한 에코로 사용할 수 있습니다. 이 패스는 삽입된 시퀀스가 회로를 정확하게 보존하도록 합니다(전역 위상 포함).

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")
이전 코드에서 출력한 회로도입니다.
# 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")
이전 코드에서 출력한 회로도입니다.
참고

동적 디커플링을 실행하기 전에 ALAPScheduleAnalysis 를 호출하여 동적 디커플링을 실행하기 전에 회로가 동적 회로 백엔드에 대한 획득 정렬 제약 조건을 충족하는지 확인해야 합니다.

매개변수

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

  • dd_sequences - 유휴 지점에 적용할 게이트 시퀀스입니다. 또는 충분한 기간의 지연이 있는 경우 우선적으로 삽입될 게이트 시퀀스 목록을 제공할 수도 있습니다. 이는 옵션으로 제공되는 sequence_min_length_ratios 을 통해 조정할 수 있습니다.

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

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

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

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

  • 추가_슬랙_분배

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

    • "중간": 시퀀스의 중간에 있는 간격에 여분의 여유를 둡니다.

    • ”가장자리”: 여분의 여유분을 가능한 한 고르게 나누어

      시퀀스의 시작과 끝 부분에 있는 간격.

  • 시퀀스_분_길이_비율 - DD 시퀀스를 삽입하기 위해 충족해야 하는 최소 지연 길이 대 DD 시퀀스 비율의 목록입니다. 예를 들어 X-X 동적 디커플링 시퀀스의 길이가 320dt 샘플이고 사용 가능한 지연이 384dt 인 경우, 비율은 384dt/320dt=1.2 입니다. 동적 디커플링의 관점에서 보면 디커플링 오류율 감소보다 더 많은 제어 노이즈가 추가될 수 있습니다. 기본값은 2.0 입니다.

  • 삽입_multiple_사이클 - 사용 가능한 기간이 2*sequence_min_length_ratio*duration(dd_sequence )을 초과하는 경우 해당 지연에 동적 디커플링 시퀀스의 여러 라운드를 삽입할 수 있습니다.

  • 커플링_맵 - 디바이스의 커플링 맵을 나타내는 방향성 그래프입니다. 커플링 맵을 지정하면 장치를 하위 회로로 분할하여 각각 다른 펄스 간격을 가진 DD 시퀀스를 적용할 수 있습니다. 현재 2개의 하위 회로를 지원합니다.

  • alt_spacings - 커플링 맵에 따라 결정되는 두 번째 서브회로에 대한 DD 게이트 사이의 간격 목록입니다. 없음인 경우 첫 번째 서브회로를 기준으로 엇갈린 균형 간격이 [d, d, d,..., d, d, 0으로] 사용됩니다.

  • schedule_idle_qubits - 유휴 큐비트에 지연을 삽입하려면 true로 설정합니다. 이 기능은 타임라인 시각화에는 유용하지만 대규모 백엔드에서 실행할 때 문제가 발생할 수 있습니다.

  • dd_barrier - 레이블에 지정된 문자열이 포함된 배리어로 종료되는 지연에만 DD를 적용합니다

  • 블록_주문_콜러블 - 필요한 블록의 수를 최소화하기 위해 노드의 순서를 생성하는 데 사용되는 콜러블입니다. 제공하지 않으면 block_order_op_nodes() 이 사용됩니다.

  • target – 백엔드 컴파일 대상.

레이즈

  • TranspilerError - 잘못된 DD 시퀀스를 지정한 경우.
  • TranspilerError - 정렬 제약 조건 값의 배수가 아닌 지속 시간을 가진 펄스 게이트가 발견된 경우.
  • TranspilerError - 커플링 맵이 지원되지 않는 경우(즉, 정도가 3을 초과하는 경우)

속성

is_analysis_pass

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

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

is_transformation_pass

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

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


메소드

__call__

__call__(circuit, property_set=None)

회로에서 패스를 실행합니다.

매개변수

  • circuit (QuantumCircuit) – 통행이 이루어지는 날짜.
  • property_set (PropertySet | dict | None) – 입력/출력 속성 집합. 분석 패스는 속성 집합을 인플레이스(in-place)로 변경할 수 있습니다. 지정되지 않은 경우, 패스의 기존 property_set 속성이 사용됩니다(설정된 경우).

리턴

변환이 성공하면, 결과값인 QuantumCircuit이 반환됩니다. 분석이 통과되면 입력 회로로 연결됩니다.

리턴 유형

QuantumCircuit

execute

execute(passmanager_ir, state, callback=None)

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

매개변수

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

리턴

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

리턴 유형

튜플[ DAGCircuit, PassManagerState ]

name

name()

패스 이름.

리턴 유형

str

run

run(dag)

GitHub

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

매개변수

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

리턴

지침으로 채워진 유휴 시간이 있는 DAG.

레이즈

TranspilerError - 특정 노드가 예약되지 않은 경우, 이 노드가 호출되기 전에 일부 트랜스폼 패스가 삽입될 수 있습니다.

리턴 유형

DAG 회로

update_status

update_status(state, run_state)

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

매개변수

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

리턴

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

리턴 유형

PassManagerState

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