Skip to main content
IBM Quantum Platform

키스킷 0.13 릴리즈 노트


0.13.0

테라 0.10.0

Prelude

0.10.0 릴리스에는 몇 가지 새로운 기능과 버그 수정이 포함되어 있습니다. 이번 릴리스의 가장 큰 변화는 트래핑된 이온 트랩 백엔드에서 키스킷을 사용하기 위한 초기 지원이 추가되었다는 것입니다.

새 기능

  • 회로의 끝에서 측정값을 원활하게 추가하거나 제거할 수 있는 새로운 방법을 QuantumCircuit 에 도입했습니다.


    measure_all()

    회로의 모든 큐비트에 barrier 연산과 measure 연산을 추가합니다. 회로의 큐비트 수와 동일한 크기의 ClassicalRegister 을 생성하여 측정값을 저장합니다.


    measure_active()

    회로의 모든 활성 큐비트에 barrier 연산과 measure 연산을 추가합니다. 큐비트에 하나 이상의 다른 연산이 작동 중이면 큐비트는 활성 상태입니다. 회로의 활성 큐비트 수와 같은 크기의 ClassicalRegister 을 생성하여 측정값을 저장합니다.


    remove_final_measurements()

    회로에서 모든 최종 측정값과 앞의 barrier 을 제거합니다. 장벽 및 기타 측정을 제외한 다른 작업이 뒤따르지 않으면 측정이 "최종"으로 간주됩니다. 측정값이 제거된 후 ClassicalRegister 의 모든 클래식 비트가 유휴 상태(연결된 작업이 없는 상태)이면 ClassicalRegister 이 제거됩니다.

    예:

    # Using measure_all()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_all()
    circuit.draw()
    
    # A ClassicalRegister with prefix measure was created.
    # It has 2 clbits because there are 2 qubits to measure
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├───
                 └───┘ ░ └╥┘┌─┐
         q_1: |0>──────░──╫─┤M├
                       ░  ║ └╥┘
    measure_0: 0 ═════════╩══╬═
    
    measure_1: 0 ════════════╩═
    
    
    # Using measure_active()
    circuit = QuantumCircuit(2)
    circuit.h(0)
    circuit.measure_active()
    circuit.draw()
    
    # This ClassicalRegister only has 1 clbit because only 1 qubit is active
    
                 ┌───┐ ░ ┌─┐
         q_0: |0>┤ H ├─░─┤M├
                 └───┘ ░ └╥┘
         q_1: |0>──────░──╫─
                       ░  ║
    measure_0: 0 ═════════╩═
    
    
    # Using remove_final_measurements()
    # Assuming circuit_all and circuit_active are the circuits from the measure_all and
    # measure_active examples above respectively
    
    circuit_all.remove_final_measurements()
    circuit_all.draw()
    # The ClassicalRegister is removed because, after the measurements were removed,
    # all of its clbits were idle
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
    
    
    circuit_active.remove_final_measurements()
    circuit_active.draw()
    # This will result in the same circuit
    
            ┌───┐
    q_0: |0>┤ H ├
            └───┘
    q_1: |0>─────
  • 이온 트랩 백엔드에서 실험을 실행할 수 있는 초기 지원이 추가되었습니다.

  • 표준 게이트 세트에 Rxx 게이트(rxx)와 글로벌 몰머-소렌슨 게이트(ms)가 추가되었습니다.

  • quantum_info.synthesis 모듈에 Cnot-Rxx/Rx/Ry 분해기 cnot_rxx_decompose 및 단일 큐비트 오일러 각도 분해기 OneQubitEulerDecomposer 가 추가되었습니다.

  • 트랜스파일러 패스 MSBasisDecomposer 가 추가되어 U3 및 Cnot 게이트에 정의된 회로를 Rxx,Ry 및 Rx에 정의된 회로로 언롤링할 수 있습니다. 이 패스는 지원되는 기본 게이트에 'rxx' 게이트가 포함된 백엔드용 사전 설정 패스 매니저에 포함됩니다.

  • 이제 qiskit.test.mock 의 백엔드에 실제 디바이스 보정 데이터의 스냅샷이 포함되어 있습니다. 각 백엔드에 대해 properties() 메서드를 통해 액세스할 수 있습니다. 노이즈 적응형 트랜스파일러 패스나 시뮬레이션을 위한 디바이스 노이즈 모델 등 백엔드 속성에 의존하는 모든 코드를 테스트하는 데 사용할 수 있습니다. 이렇게 하면 라이브 백엔드로 이동할 필요 없이 테스트 및 개발 주기를 단축할 수 있습니다.

  • 결과 클래스가 부분 결과를 반환하도록 허용합니다. 성공한 실험과 실패한 실험이 포함된 유효한 결과 스키마가 로드되면 성공한 실험의 데이터에 액세스하는 동시에 실패한 실험에 대한 예외를 발생시키고 실패한 결과에 대한 적절한 오류 메시지를 표시할 수 있습니다.

  • 다음 시각화 기능에 ax kwarg가 추가되었습니다:

    • qiskit.visualization.plot_histogram
    • qiskit.visualization.plot_state_paulivec
    • qiskit.visualization.plot_state_qsphere
    • qiskit.visualization.circuit_drawer (mpl 백엔드만 해당)
    • qiskit.QuantumCircuit.draw (mpl 백엔드만 해당)

    이 kwarg는 시각화 함수에 matplotlib.axes.Axes 객체를 전달하는 데 사용됩니다. 이를 통해 이러한 시각화 기능을 더 큰 시각화 워크플로우에 통합할 수 있습니다. 또한 ax kwarg를 지정하면 시각화 함수에서 반환되지 않습니다.

  • 다음 시각화 기능에 ax_realax_imag kwarg가 추가되었습니다:

    • qiskit.visualization.plot_state_hinton
    • qiskit.visualization.plot_state_city

    이 새로운 karg는 다른 시각화 기능에 새로 추가된 ax kwarg와 동일하게 작동합니다. 그러나 이 플롯은 두 개의 축(하나는 실제 컴포넌트, 다른 하나는 가상 컴포넌트)을 사용하기 때문입니다. 두 개의 kwarg를 사용하면 항상 두 가지를 모두 수행하는 대신 구성 요소 중 하나에 대해서만 시각화를 생성할 수 있는 유연성도 제공합니다. 예를 들어,

    from matplotlib import pyplot as plt
    from qiskit.visualization import plot_state_hinton
    
    ax = plt.gca()
    
    plot_state_hinton(psi, ax_real=ax)

    는 실제 컴포넌트의 플롯만 생성합니다.

  • 이제 새로운 메서드 대체를 사용하여 지정된 패스 관리자를 편집할 수 있습니다. 이 방법을 사용하면 패스 관리자에서 특정 단계를 교체할 수 있으므로 사전 설정된 패스 관리자를 다룰 때 유용하게 사용할 수 있습니다. 예를 들어 최적화 수준 0에서 사용되는 패스 관리자의 레이아웃 선택기를 편집해 보겠습니다:

    from qiskit.transpiler.preset_passmanagers.level0 import level_0_pass_manager
    from qiskit.transpiler.transpile_config import TranspileConfig
    
    pass_manager = level_0_pass_manager(TranspileConfig(coupling_map=CouplingMap([[0,1]])))
    
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: TrivialLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    레이아웃 선택은 [1단계에서] 설정합니다. 이를 다음과 같이 대체해 보겠습니다 DenseLayout:

    from qiskit.transpiler.passes import DenseLayout
    
    pass_manager.replace(1, DenseLayout(coupling_map), condition=lambda property_set: not property_set['layout'])
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] Conditional: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller

    아무 조건 없이 교체하려면 설정 항목 바로 가기를 사용하면 됩니다:

    pass_manager[1] = DenseLayout(coupling_map)
    pass_manager.draw()
    [0] FlowLinear: SetLayout
    [1] FlowLinear: DenseLayout
    [2] FlowLinear: FullAncillaAllocation, EnlargeWithAncilla, ApplyLayout
    [3] FlowLinear: Unroller
  • 펄스에 삽입할 수 있는 새로운 펄스 명령 Delay 을 도입했습니다 Schedule. 이 명령은 duration 를 허용하며 Channel 에 추가할 수 있습니다. 지연 중에는 다른 명령이 채널에서 예약되지 않을 수 있습니다.

    지연은 다른 펄스 명령과 마찬가지로 추가할 수 있습니다. 예를 들어,

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | sched
    
    # pad schedule
    padded_sched = pad(sched)
    
    assert padded_sched == ref_sched

    예를 들어 패딩할 추가 채널과 패딩할 시간을 전달할 수도 있습니다:

    from qiskit import pulse
    from qiskit.pulse.utils import pad
    
    dc0 = pulse.DriveChannel(0)
    dc1 = pulse.DriveChannel(1)
    
    delay = pulse.Delay(1)
    test_pulse = pulse.SamplePulse([1.0])
    
    sched = pulse.Schedule()
    sched += test_pulse(dc0).shift(1)
    
    # build padded schedule by hand
    ref_sched = delay(dc0) | delay(dc1) |  sched
    
    # pad schedule across both channels until up until the first time step
    padded_sched = pad(sched, channels=[dc0, dc1], until=1)
    
    assert padded_sched == ref_sched

업그레이드 주의사항

  • qiskit.QuantumCircuit 객체의 data 속성에 대한 할당 및 수정은 이제 QuantumCircuit API 전체에서 사용되는 것과 동일한 규칙에 따라 유효성이 검사됩니다. 이는 이제 data 속성이 알려진 형식이라고 가정할 수 있기 때문에 회로 API의 성능을 개선하기 위해 수행되었습니다. 이전에 회로 개체의 data 속성을 수동으로 수정한 경우 수정으로 인해 컨텍스트 형식의 명령어 목록이 아닌 다른 데이터 구조가 생성된 경우 더 이상 작동하지 않을 수 있습니다 [(instruction, qargs, cargs)]

  • 이제 최적화 레벨 2에 대한 트랜스파일러 기본 패스매니저는 NoiseAdaptiveLayout 대신 DenseLayout 레이아웃 선택 메커니즘을 기본으로 사용합니다. Denselayout 패스도 소음을 인식하도록 수정되었습니다.

  • 더 이상 사용되지 않는 DeviceSpecification 클래스가 제거되었습니다. 대신 PulseChannelSpec 을 사용해야 합니다. 예를 들어 다음과 같이 실행할 수 있습니다:

    device = pulse.PulseChannelSpec.from_backend(backend)
    device.drives[0]    # for DeviceSpecification, this was device.q[0].drive
    device.memoryslots  # this was device.mem
  • 더 이상 사용되지 않는 모듈 qiskit.pulse.ops 이 제거되었습니다. ScheduleInstruction 방법을 직접 사용하세요. 예를 들어

    ops.union(schedule_0, schedule_1)
    ops.union(instruction, schedule)  # etc

    대신 사용하세요:

    schedule_0.union(schedule_1)
    instruction.union(schedule)

    이 패턴은 다른 ops 함수에도 동일하게 적용됩니다: insert, shift, append, flatten 등에도 동일하게 적용됩니다.

지원 중단 노트

  • qiskit.circuit.Instructioncontrol 속성을 클래식 제어에 사용하는 것은 이제 더 이상 사용되지 않습니다. 앞으로 이 속성은 양자 제어에 사용될 것입니다. 클래식 조건부 연산은 대신 qiskit.circuit.Instructioncondition 속성에 의해 처리됩니다.
  • qiskit.qasm.node.Node 유형의 객체로 qiskit.circuit.Instruction 매개변수 설정에 대한 지원은 더 이상 사용되지 않습니다. NodeInstruction 객체를 초기화하거나 Instruction.params 설정자를 호출하기 전에 이전에 매개 변수로 사용되었던 객체를 지원되는 유형으로 변환해야 합니다. 지원되는 유형은 int, float, complex, str, qiskit.circuit.ParameterExpression 또는 numpy.ndarray 입니다.
  • 키스킷 0.9.0 릴리스에서는 비트(큐비트와 클래식 비트 모두)의 표현이 (register, index) 형식의 튜플에서 qiskit.circuit.Qubitqiskit.circuit.Clbit 클래스의 인스턴스로 변경되었습니다. 모든 것이 튜플에서 객체로 전환됨에 따라 레거시 튜플과 비트 클래스 간의 동등성을 비교하는 이전 버전과의 호환성이 지원되었습니다. 이 지원은 현재 더 이상 사용되지 않으며 향후 제거될 예정입니다. 앞으로는 모든 것이 튜플 대신 비트 클래스를 사용해야 합니다.
  • qiskit.QuantumCircuit.draw() 또는 qiskit.visualization.circuit_drawer()mpl 출력을 사용하고 style kwarg를 사용하는 경우, 지원되지 않는 사전 키를 style` 사전의 일부로 전달하는 것은 이제 더 이상 사용되지 않습니다. 이전에는 이러한 알 수 없는 인수가 조용히 무시되었지만, 앞으로는 지원되지 않는 키는 예외를 발생시킵니다.
  • qiskit.QuantumCircuit.draw() 메서드의 line length kwarg와 텍스트 출력 모드의 qiskit.visualization.circuit_drawer() 함수는 더 이상 사용되지 않습니다. 텍스트 출력 모드에서 동일하게 작동하는 fold kwarg로 대체되었습니다(하지만 이제 mpl 출력 모드도 지원합니다). line_length 은 향후 릴리스에서 제거될 예정이므로 대신 fold 을 사용하도록 호출을 업데이트해야 합니다.
  • qiskit.QuantumCircuit.draw() 메서드 및 qiskit.visualization.circuit_drawer() 함수에 대한 style 딕 콰그의 fold 필드는 더 이상 사용되지 않습니다. 두 함수 모두 fold kwarg로 대체되었습니다. 이 kwarg는 스타일 딕셔너리의 필드와 동일하게 작동합니다.

버그 수정

  • 모든 유형의 회로 도면의 기본이 되는 명령어 레이어링이 오른쪽/왼쪽 정당화를 처리하도록 변경되었습니다. 이로 인해 토폴로지적으로는 이전 버전의 렌더링과 동일하지만 시각적으로는 이전 버전과 다른 결과물이 출력되는 경우가 있습니다. 문제 #2802 수정
  • 펄스 Qobj의 QobjExperimentHeadermemory_slots 를 추가합니다. 펄스 실험 결과의 meas_level=2 데이터 형식의 버그가 수정되었습니다. 측정된 양자 상태는 memory_slots 에 설정된 숫자에 따라 패딩이 0인 비트 문자열로 반환됩니다.
  • 라텍스 회로 서랍의 rzz 게이트 시각화를 cu1 게이트와 일치하도록 수정하여 rzz 게이트의 대칭을 반영하도록 수정했습니다. 이 수정은 qcircuit 라텍스 패키지의 cds 명령을 기반으로 합니다. 문제 #1957 수정

기타 참고사항

  • matplotlib.figure.Figure 시각화 함수가 반환하는 객체는 더 이상 기본적으로 항상 닫히지 않습니다. 대신 반환된 그림 객체는 구성된 matplotlib 백엔드가 인라인 주피터 백엔드( %matplotlib inline 또는 %matplotlib notebook 로 설정된 경우)인 경우에만 닫힙니다. 출력 그림 객체는 여전히 이러한 백엔드로 닫혀 있어 jupyter 노트북에서 중복 출력을 방지합니다( Figure.close() 이 원래 추가된 이유입니다).

에어 0.3

변경 없음

이그니스 0.2

변경 없음

아쿠아 0.6

변경 없음

IBM Q 제공자 0.3

변경 없음

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