Skip to main content
IBM Quantum Platform

키스킷 0.28 릴리즈 노트


0.28.0

테라 0.18.0

Prelude

이번 릴리스에는 많은 새로운 기능과 버그 수정이 포함되어 있습니다. 이번 릴리스의 하이라이트는 두 가지 새로운 트랜스파일러 패스, BIPMappingDynamicalDecoupling이 패스는 새로운 pulse_optimize kwarg 와 결합하면 UnitarySynthesis 에 설명된 기술을 사용하여 퀀텀 볼륨 64 결과를 다시 생성할 수 있습니다: https://arxiv.org/abs/2008.08571. 이 새로운 트랜스파일러 패스와 옵션은 일반적으로 모든 회로 최적화에 적용할 수 있습니다.

새 기능

  • 생성자에 대한 measurement_error_mitgation kwarg QuantumInstance 생성자를 이미 지원되던 CompleteMeasFitter 외에 qiskit-ignis의 TensoredMeasFitter 클래스로 설정할 수 있습니다. TensoredMeasFitter 을 사용하는 경우 새로운 mit_pattern kwarg를 설정하여 TensoredMeasFitter 사용할 큐비트를 지정할 수도 있습니다. 예상 형식은 TensoredMeasFitter 문서에서 mit_pattern 에 대한 문서를 참조할 수 있습니다.

  • basis kwarg를 통해 지정된 단일 큐비트 게이트의 분해 방법이 OneQubitEulerDecomposer 이제 XX 게이트와 X\sqrt{X} 게이트를 직접 사용할 수 있도록 'ZSXX' 기반도 포함하도록 확장되었습니다.

  • 두 개의 새로운 패스 추가 AlignMeasuresValidatePulseGates 모듈에 qiskit.transpiler.passes 모듈에 이러한 패스는 하드웨어 인식 최적화이며, 백엔드에 대한 명령어 시간 할당에 대한 정렬 제한을 관리하는 데 사용되는 유효성 검사 루틴입니다.

    백엔드에 Measure 명령어의 정렬에 제한이 있는 경우(시간 정량화 측면에서) AlignMeasures 패스는 예약된 회로의 지연을 조정하여 백엔드의 제약 조건에 따라 회로의 모든 Measure 명령어가 정렬되도록 하는 데 사용됩니다. 패스는 ValidatePulseGates 패스는 커스텀 펄스 게이트(커스텀 펄스 정의가 있는 게이트)가 있는지 확인하는 데 사용됩니다 calibrations 속성에 커스텀 펄스 정의가 있는 QuantumCircuit 객체의 속성에 커스텀 펄스 정의가 있는 게이트)가 타겟 백엔드에 대한 정렬 제약 조건이 주어졌을 때 유효한지 확인합니다.

    함수에서 사용되는 내장 preset_passmangers 에서 transpile() 함수에서, 이러한 패스는 전용 timing_constraints kwarg on을 통해 정렬 제약 조건이 있거나 transpile() 을 통해 또는 대상 백엔드의 객체에 timing_constraints 속성이 있는 경우 BackendConfiguration 속성이 있는 경우 자동으로 트리거됩니다.

    IBM Quantum Services ( qiskit-ibmq-provider 패키지를 통해 액세스 가능)의 백엔드에서 가까운 시일 내에 정렬 정보를 제공할 예정입니다.

    예를 들어,

    from qiskit import circuit, transpile
    from qiskit.test.mock import FakeArmonk
    
    backend = FakeArmonk()
    
    qc = circuit.QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(110, 0, unit="dt")
    qc.measure(0, 0)
    qc.draw('mpl')
    qct = transpile(qc, backend, scheduling_method='alap',
                    timing_constraints={'acquire_alignment': 16})
    qct.draw('mpl')
  • 에 설명된 대로 BIP(이진 정수 프로그래밍) 문제를 해결하여 최적의 레이아웃과 라우팅을 한 번에 찾으려는 새로운 트랜스파일러 패스 클래스 qiskit.transpiler.passes.BIPMapping 가 추가되었습니다 arXiv:2106.06446 가 추가되었습니다.

    BIPMapping 패스('레이아웃 및 라우팅'을 지칭하기 위해 '매핑'이라고 명명)는 매핑 문제를 BIP(이진 정수 프로그래밍) 문제로 나타내며, BIP 문제를 해결하기 위해 CPLEX(cplex)에 의존합니다. CPLEX를 포함한 종속 라이브러리는 qiskit-terra와 함께 설치할 수 있습니다:

    pip install qiskit-terra[bip-mapper]

    무료 버전의 CPLEX는 약 5큐비트 미만의 회로 매핑과 같은 작은 BIP 문제만 해결할 수 있으므로, 더 큰 회로를 매핑하려면 유료 버전의 CPLEX가 필요할 수 있습니다.

    BIP 매퍼는 큐비트 또는 게이트 수에 따라 확장성이 떨어집니다. 예를 들어, 10큐비트를 초과하는 coupling_map 에서는 BIP 솔버(CPLEX)가 기본 시간 제한 내에 해를 찾을 수 없기 때문에 작동하지 않습니다.

    매핑에 사용할 물리적 큐비트를 고정하려면(예: 퀀텀 볼륨(QV) 회로 실행), 사용할 큐비트만 포함된 coupling_map 을 지정해야 합니다.

    다음은 QV 회로를 트랜스파일하기 위해 패스 매니저를 빌드하는 최소한의 예제 코드입니다:

    num_qubits = 4  # QV16
    circ = QuantumVolume(num_qubits=num_qubits)
    
    backend = ...
    basis_gates = backend.configuration().basis_gates
    coupling_map = CouplingMap.from_line(num_qubits)  # supply your own coupling map
    
    def _not_mapped(property_set):
        return not property_set["is_swap_mapped"]
    
    def _opt_control(property_set):
        return not property_set["depth_fixed_point"]
    
    from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel
    pm = PassManager()
    # preparation
    pm.append([
        Unroll3qOrMore(),
        TrivialLayout(coupling_map),
        FullAncillaAllocation(coupling_map),
        EnlargeWithAncilla(),
        BarrierBeforeFinalMeasurements()
    ])
    # mapping
    pm.append(BIPMapping(coupling_map))
    pm.append(CheckMap(coupling_map))
    pm.append(Error(msg="BIP mapper failed to map", action="raise"),
              condition=_not_mapped)
    # post optimization
    pm.append([
        Depth(),
        FixedPoint("depth"),
        Collect2qBlocks(),
        ConsolidateBlocks(basis_gates=basis_gates),
        UnitarySynthesis(basis_gates),
        Optimize1qGatesDecomposition(basis_gates),
        CommutativeCancellation(),
        UnrollCustomDefinitions(sel, basis_gates),
        BasisTranslator(sel, basis_gates)
    ], do_while=_opt_control)
    
    transpile_circ = pm.run(circ)
  • 새로운 생성자 메서드 initialize_from() 에 새로운 생성자 메서드 ScheduleScheduleBlock 클래스에 새로운 생성자 메서드가 추가되었습니다. 이 메서드는 다른 스케줄의 속성을 가져오는 새 빈 스케줄을 초기화합니다. 예를 들어,

    sched = Schedule(name='my_sched')
    new_sched = Schedule.initialize_from(sched)
    
    assert sched.name == new_sched.name
  • 함수( line_discipline)에 새로운 kwarg가 추가되었습니다 job_monitor() 함수에 추가되었습니다. 이 kwarg를 사용하면 job_monitor 출력에 사용되는 캐리지 리턴 문자를 변경할 수 있습니다. line_discipline kwarg의 기본값은 이전에 사용하던 '\r' 입니다.

  • 추상 Pulse 클래스( 다음과 같은 클래스의 부모 클래스인 Waveform, ConstantGaussian )에는 이제 생성자 limit_amplitude 에 새로운 kwarg가 있으며, False 로 설정하여 이전에 하드 코딩된 진폭 제한( 1)을 비활성화할 수 있습니다. 펄스 클래스의 글로벌 기본값을 변경하기 위해 클래스 속성으로 직접 설정할 수도 있습니다. 예를 들어,

    from qiskit.pulse.library import Waveform
    
    # Change the default value of limit_amplitude to False
    Waveform.limit_amplitude = False
    wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000)))
  • 새로운 클래스 PauliList클래스가 qiskit.quantum_info 모듈에 추가되었습니다. 이 클래스는 연산자 목록을 효율적으로 표현하는 데 사용됩니다 Pauli 연산자 목록을 효율적으로 표현하는 데 사용됩니다. 이 새 클래스는 기존 PauliTable 클래스와 동일한 부모 클래스에서 상속되지만(따라서 대부분 같은 의미로 사용할 수 있음), PauliTable 클래스와는 다릅니다 qiskit.quantum_info.PauliList 클래스는 Z4 페이즈를 처리할 수 있습니다.

  • 새로운 트랜스파일러 패스를 추가했습니다, RemoveBarriersqiskit.transpiler.passes. 이 패스는 회로의 모든 장벽을 제거하는 데 사용됩니다.

  • 새 옵티마이저 클래스를 추가합니다, SciPyOptimizerqiskit.algorithms.optimizers 모듈에 추가합니다. 이 클래스는 scipy.optimize.minimize 함수 (문서) 의 간단한 래퍼 클래스로, scipy.optimize.minimize 에서 지원하는 모든 최적화 솔버와 모든 매개변수(예: 콜백)를 사용할 수 있습니다. 예를 들어,

    from qiskit.algorithms.optimizers import SciPyOptimizer
    
    values = []
    
    def callback(x):
        values.append(x)
    
    optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback)
  • 패스가 HoareOptimizer 패스가 개선되어 이제 모든 제어 큐비트가 상태인 경우 회로에서 ControlledGate 를 모든 제어 큐비트가 1|1\rangle 상태인 경우 기본 게이트로 회로에서 대체할 수 있도록 개선되었습니다.

  • 두 가지 새로운 메서드가 추가되었습니다, is_successor()is_predecessor()메서드를 DAGCircuit 클래스에 이 함수는 노드가 다른 노드의 후속 노드인지 또는 이전 노드인지 확인하는 데 사용됩니다 DAGCircuit.

  • 새로운 트랜스파일러 패스 RZXCalibrationBuilderNoEchoqiskit.transpiler.passes 모듈에 추가되었습니다. 이 패스는 기존 RZXCalibrationBuilderRZXGate(theta) 에 대한 캘리브레이션을 생성한다는 점에서 비슷하지만 RZXCalibrationBuilderNoEcho 는 펄스 스케줄에 에코 펄스를 삽입하지 않고 이 작업을 수행합니다. 이렇게 하면 교차 공명 시퀀스에서 에코를 게이트로 노출하여 트랜스파일러가 이를 단순화할 수 있습니다. 패스는 RZXCalibrationBuilderNoEcho 패스는 하드웨어 네이티브 방향의 CXGate.

  • 새로운 kwarg( wrap)가 메서드에 추가되었습니다 compose() 메서드에 QuantumCircuit. 이를 통해 구성된 회로를 인스트럭션으로 래핑할지 여부를 선택할 수 있습니다. 기본값은 False, 즉 래핑이 없는 상태입니다. 예를 들어,

    from qiskit import QuantumCircuit
    circuit = QuantumCircuit(2)
    circuit.h([0, 1])
    other = QuantumCircuit(2)
    other.x([0, 1])
    print(circuit.compose(other, wrap=True))  # wrapped
    print(circuit.compose(other, wrap=False))  # not wrapped
  • 새로운 어트리뷰트 control_channels속성이 추가되었습니다 PulseBackendConfiguration 클래스에 추가되었습니다. 이 속성은 백엔드의 제어 채널을 큐비트와 오브젝트 목록의 ControlChannel 객체 목록에 매핑합니다.

  • epsilon Isometry 클래스의 생성자와 해당 메서드에 해당하는 QuantumCircuit 메서드 isometry(). 이 kwarg를 사용하면 Isometry 게이트에서 사용하는 엡실론 허용 오차를 선택적으로 설정할 수 있습니다. 예를 들어,

    import numpy as np
    from qiskit import QuantumRegister, QuantumCircuit
    
    tolerance = 1e-8
    iso = np.eye(2,2)
    num_q_output = int(np.log2(iso.shape[0]))
    num_q_input = int(np.log2(iso.shape[1]))
    q = QuantumRegister(num_q_output)
    qc = QuantumCircuit(q)
    
    qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance)
  • 트랜스파일러 패스를 추가했습니다, DynamicalDecoupling에 트랜스파일러 패스 qiskit.transpiler.passes 에 (물리적 큐비트에 매핑하고 스케줄링한 후) 회로의 유휴 기간에 동적 디커플링 시퀀스를 삽입하기 위한 트랜스파일러 패스를 추가했습니다. 패스를 통해 DD 게이트의 순서, 게이트 사이의 간격, 적용할 큐비트를 제어할 수 있습니다. 예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import XGate
    from qiskit.transpiler import PassManager, InstructionDurations
    from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling
    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)]
    )
    
    dd_sequence = [XGate(), XGate()]
    
    pm = PassManager([ALAPSchedule(durations),
                      DynamicalDecoupling(durations, dd_sequence)])
    circ_dd = pm.run(circ)
    timeline_drawer(circ_dd)
  • 메서드의 QuantumCircuit 메서드 qasm() 에는 함수에 의해 생성된 출력 QASM 파일의 문자 인코딩을 선택적으로 설정하는 데 사용할 수 있는 새로운 kwarg( encoding)가 있습니다. Python 표준 라이브러리의 코덱 모듈에서 유효한 코덱 또는 별칭 문자열로 설정할 수 있습니다.

  • 새 클래스를 추가했습니다, EvolvedOperatorAnsatz클래스를 qiskit.circuit.library 모듈에 새 클래스, 를 추가했습니다. 이 라이브러리 회로는 이전에 키스킷 네이처에 있던 것으로, 진화 시간이 가변 파라미터인 시간 진화 연산자로 구성된 앤사츠 회로를 구성하는 데 사용할 수 있습니다. 이러한 안사츠 회로의 예로는 키스킷 네이처의 chemistry 모듈에 있는 UCCSD 클래스 또는 QAOAAnsatz 클래스.

  • ibmq_guadalupe 백엔드에 대한 새로운 가짜 백엔드 클래스는 qiskit.test.mock 에서 사용할 수 있습니다. 다른 가짜 백엔드와 마찬가지로 여기에는 캘리브레이션 데이터의 스냅샷(예: backend.defaults())이 포함됩니다 및 오류 데이터(예: backend.properties()) 실제 시스템에서 가져온 것으로 로컬 테스트, 컴파일 및 시뮬레이션에 사용할 수 있습니다.

  • 새로운 방법 children() 메서드 Schedule 클래스에 대한 새로운 메서드가 추가되었습니다. 이 메서드는 객체의 자식 스케줄 구성 요소를 Schedule 객체의 자식 스케줄 컴포넌트를 튜플로 반환합니다. 평탄화 없이 중첩된 일정을 반환합니다. 이 방법은 비공개( _children() ) 방법과 동일하지만 공개적이고 안정적인 인터페이스를 제공합니다.

  • 새로운 옵티마이저 클래스 GradientDescentqiskit.algorithms.optimizers 모듈에 추가되었습니다. 이 옵티마이저 클래스는 다음과 같은 양자 가변 알고리즘과 함께 사용하기 위한 표준 그라데이션 하강 최적화 알고리즘을 구현합니다 VQE. 이 클래스를 사용하는 방법에 대한 자세한 설명과 예제는 GradientDescent 클래스 문서를 참고하세요.

  • 새로운 옵티마이저 클래스 QNSPSAqiskit.algorithms.optimizers 모듈에 추가되었습니다. 이 클래스는 2-SPSA 알고리즘의 일반화인 양자 자연 SPSA(QN-SPSA) 알고리즘을 구현하고 헤시안 대신 양자 피셔 정보 행렬을 추정하여 양자 자연 경사도의 확률적 추정치를 얻습니다. 이 새로운 옵티마이저를 사용하는 방법에 대한 예제는 QNSPSA 클래스 문서를 참조하세요.

  • 클래스의 생성자에 새로운 kwarg, second_order 이 추가되었습니다 SPSA 클래스의 생성자에 qiskit.algorithms.optimizers 모듈의 클래스 생성자에 추가되었습니다. True 로 설정하면 2차 SPSA를 사용할 수 있습니다. 2 차 SPSA 또는 2-SPSA는 일반 SPSA 알고리즘의 확장으로 기울기와 함께 헤시안 추정이 가능하며, 파라미터 업데이트 단계 전에 기울기를 사전 조정하는 데 사용됩니다. 두 번째 방법으로서, 이는 SPSA의 수렴을 개선하기 위한 시도입니다. 이 옵션을 사용하는 방법에 대한 예제는 SPSA 클래스 문서를 참조하세요.

  • latex 또는 latex_source 출력 모드를 사용하는 경우 circuit_drawer() 또는 draw()QuantumCircuit 를 사용할 때 mpl 출력 형식과 마찬가지로 style kwarg를 사용할 수 있습니다. 그러나 mpl 출력 모드와 달리 latex 또는 latex_source 출력 모드를 사용할 때는 displaytext 필드만 사용됩니다(둘 다 색상을 지원하지 않으므로).

  • mpl 또는 latex 출력 메서드를 사용하는 경우 circuit_drawer() 함수 또는 draw()QuantumCircuit이제 텍스트에 수학 모드 서식을 사용하고 style kwarg를 사용자가 생성한 이름이나 레이블이 있는 딕셔너리로 설정하여 색상 서식(mpl 만 해당)을 설정할 수 있습니다. 예를 들어, 구독을 추가하고 게이트 색상을 변경합니다:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library import HGate
    qc = QuantumCircuit(3)
    qc.append(HGate(label='h1'), [0])
    qc.append(HGate(label='h2'), [1])
    qc.append(HGate(label='h3'), [2])
    qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'},
        'displaycolor': {'h2': ('#EEDD00', '#FF0000')}})
  • 세 가지 새로운 클래스를 추가했습니다, CDKMRippleCarryAdder, ClassicalAdderDraperQFTAdderqiskit.circuit.library 모듈에 추가했습니다. 이 새로운 회로 클래스는 동일한 크기의 큐비트 레지스터 두 개를 고전적으로 더하는 데 사용됩니다. nn 큐비트에서 an|a\rangle_nbn|b\rangle_n 두 레지스터의 경우, 세 개의 새로운 클래스가 연산을 수행합니다:

anbnana+bn+1.|a\rangle_n |b\rangle_n \mapsto |a\rangle_n |a + b\rangle_{n + 1}.

예를 들어,

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector

# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)

# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)

# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)

# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0]  # we only have a single state

# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result)  # '011' = 3 = 1 + 2
  • 두 개의 새로운 클래스를 추가했습니다, RGQFTMultiplierHRSCumulativeMultiplier를 추가했습니다 qiskit.circuit.library 모듈에 추가했습니다. 이 클래스는 크기가 같은 두 큐비트 레지스터의 고전적인 곱셈을 수행하는 데 사용됩니다. nn 큐비트에 있는 두 개의 레지스터 an|a\rangle_nbn|b\rangle_n 의 경우, 두 개의 새로운 클래스가 연산을 수행합니다
anbn02nanbnab2n.|a\rangle_n |b\rangle_n |0\rangle_{2n} \mapsto |a\rangle_n |b\rangle_n |a \cdot b\rangle_{2n}.

예를 들어,

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector

num_state_qubits = 2

# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))

# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))

# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)

# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)

# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0]  # we only have a single state

# skip both input registers
result = state[:-2*num_state_qubits]
print(result)  # '1001' = 9 = 3 * 3
  • 클래스는 이제 Delay 클래스는 이제 ParameterExpression 또는 Parameterduration 값을 생성자 및 해당 클래스의 duration 어트리뷰트.

    예를 들어,

    idle_dur = Parameter('t')
    qc = QuantumCircuit(1, 1)
    qc.x(0)
    qc.delay(idle_dur, 0, 'us')
    qc.measure(0, 0)
    print(qc)  # parameterized delay in us (micro seconds)
    
    # assign before transpilation
    assigned = qc.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in us
    transpiled = transpile(assigned, some_backend_with_dt)
    print(transpiled)  # delay in dt
    
    # assign after transpilation
    transpiled = transpile(qc, some_backend_with_dt)
    print(transpiled)  # parameterized delay in dt
    assigned = transpiled.assign_parameters({idle_dur: 0.1})
    print(assigned)  # delay in dt
  • 새로운 바이너리 직렬화 형식인 QPY가 도입되었습니다. 이는 키스킷 고유의 하위 호환성(이전 버전의 키스킷으로 생성된 QPY 파일을 최신 버전의 키스킷에서 로드할 수 있음)이 있는 빠른 바이너리 직렬화 포맷으로 설계되었습니다. QPY 직렬화 도구는 qiskit.circuit.qpy_serialization 모듈을 통해 사용할 수 있습니다. 예를 들어 QPY 파일을 생성하는 경우입니다:

    from datetime import datetime
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit import qpy_serialization
    
    qc = QuantumCircuit(
      2, metadata={'created_at': datetime.utcnow().isoformat()}
    )
    qc.h(0)
    qc.cx(0, 1)
    qc.measure_all()
    
    circuits = [qc] * 5
    
    with open('five_bells.qpy', 'wb') as qpy_file:
        qpy_serialization.dump(circuits, qpy_file)

    그런 다음 QPY 파일에 저장된 5개의 회로를 로드할 수 있습니다:

    from qiskit.circuit.qpy_serialization
    
    with open('five_bells.qpy', 'rb') as qpy_file:
        circuits = qpy_serialization.load(qpy_file)

    QPY 파일 형식 사양은 모듈 설명서에서 확인할 수 있습니다.

  • 클래스는 TwoQubitBasisDecomposer 클래스는 CX, √X 및 가상 Rz 게이트가 있는 기저에 대해 펄스 최적 분해를 수행하도록 업데이트되었습니다 https://arxiv.org/pdf/2008.08571. 여기서 펄스 최적이란 모든 CX 게이트 앞이나 뒤에 더 많은 로컬 게이트가 있는 대신 분해의 CX 게이트 사이의 게이트 지속 시간이 줄어들어 회로로 구성될 때 인접한 게이트로 단일 큐비트 압축이 발생하여 전체 시퀀스 지속 시간이 줄어들 수 있다는 것을 의미합니다.

    에 대한 새로운 키워드 인자 `pulse_optimize 가 생성자에 추가되었습니다 TwoQubitBasisDecomposer 의 생성자에 추가되었습니다:

    • None: 펄스 최적 분해를 시도합니다. 디코더를 기준으로 최적의 펄스 분해를 알 수 없는 경우 경고 없이 표준 분해로 되돌아갑니다. 기본 설정입니다.
    • True: 펄스 최적 분해를 시도합니다. 디코더의 기반에 대해 펄스 최적 분해를 알 수 없는 경우 QiskitError 을 올리세요.
    • False: 펄스 최적 분해를 시도하지 마십시오.

    예를 들어,

    from qiskit.quantum_info import TwoQubitBasisDecomposer
    from qiskit.circuit.library import CXGate
    from qiskit.quantum_info import random_unitary
    
    unitary_matrix = random_unitary(4)
    
    decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True)
    circuit = decomposer(unitary_matrix)
  • 에 있는 트랜스파일러 패스 UnitarySynthesis qiskit.transpiler.passes 가 펄스 최적 분해 수행을 지원하도록 업데이트되었습니다. 이는 주로 생성자에 추가되어 펄스 최적 합성 수행 여부를 제어하는 데 사용되는 pulse_optimize 키워드 인수를 통해 이루어집니다. 이 kwarg의 동작은 클래스의 생성자에서 pulse_optimize kwarg를 반영합니다 TwoQubitBasisDecomposer 클래스의 생성자와 유사합니다. 또한 생성자에는 합성을 시도할 게이트 이름 목록을 지정하는 데 사용되는 또 다른 새로운 키워드 인수 synth_gates 가 있습니다. Nonepulse_optimizeFalse 또는 None 인 경우 "unitary" 을 사용합니다. 없음이고 pulse_optimize가 True 인 경우 "unitary""swap" 를 사용합니다. 합성에서 CX 게이트의 방향은 임의적이므로 다른 키워드 인자 natural_direction 를 추가하여 먼저 커플링 맵을 고려한 다음 CXGate 기간을 추가하여 합성을 생성할 CX 방향을 선택할 수 있습니다.

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis
    from qiskit.test.mock import FakeVigo
    from qiskit.quantum_info.random import random_unitary
    
    backend = FakeVigo()
    conf = backend.configuration()
    coupling_map = CouplingMap(conf.coupling_map)
    triv_layout_pass = TrivialLayout(coupling_map)
    circ = QuantumCircuit(2)
    circ.unitary(random_unitary(4), [0, 1])
    unisynth_pass = UnitarySynthesis(
        basis_gates=conf.basis_gates,
        coupling_map=None,
        backend_props=backend.properties(),
        pulse_optimize=True,
        natural_direction=True,
        synth_gates=['unitary'])
    pm = PassManager([triv_layout_pass, unisynth_pass])
    optimal_circ = pm.run(circ)
  • basis 인자에 대한 새로운 기준 옵션인 'XZX' 이 추가되었습니다 OneQubitEulerDecomposer 클래스에 추가되었습니다.

  • 새로운 메서드가 추가되었습니다, get_instructions()메서드를 추가했습니다 QuantumCircuit 클래스에 추가되었습니다. 이 메서드는 회로의 모든 Instruction 객체를 반환하는 데 사용됩니다 namename 인자와 일치하는 모든 객체를 반환하고, 관련 qargscargs 목록과 함께 QubitClbit 객체를 반환합니다.

  • 새로운 옵션( all )이 키스킷-테라 패키지에 추가되었습니다. 예를 들어 하나의 추가 기능으로 모든 선택적 요구 사항을 설치할 수 있습니다: pip install 'qiskit-terra[all]' 이전에는 모든 선택적 종속 요소를 동시에 설치하려면 모든 추가 항목을 개별적으로 나열해야 했습니다.

  • 두 개의 새로운 클래스 추가 ProbDistributionQuasiDistribution 클래스를 추가하여 각각 확률 분포와 준확률 분포를 처리할 수 있도록 했습니다. 이 두 객체는 확률 및 준확률 분포 작업을 위한 추가 메서드를 추가하는 사전 하위 클래스입니다.

  • 새로운 settings 속성을 추가했습니다 Optimizer 모듈의 모든 옵티마이저 클래스의 기반이 되는 qiskit.algorithms.optimizers 모듈의 모든 옵티마이저 클래스의 기반이 되는 새로운 프로퍼티를 추가했습니다. 이 속성은 동일한 옵티마이저 클래스의 다른 인스턴스를 인스턴스화하는 데 사용할 수 있는 옵티마이저 설정의 Python 딕셔너리를 반환합니다. 예를 들어,

    from qiskit.algorithms.optimizers import GradientDescent
    
    optimizer = GradientDescent(maxiter=10, learning_rate=0.01)
    settings = optimizer.settings
    new_optimizer = GradientDescent(**settings)

    settings 사전은 JSON 또는 다른 직렬화 형식을 사용하여 옵티마이저 객체를 직렬화하는 데에도 잠재적으로 유용할 수 있습니다.

  • qiskit.user_config 모듈에 새로운 기능인 set_config() 이 추가되었습니다. 이 함수는 키스킷 API에서 사용자 구성의 값을 설정할 수 있게 해줍니다. 예를 들어,

    from qiskit.user_config import set_config
    set_config("circuit_drawer", "mpl", section="default", file="settings.conf")

    를 입력하면 settings.conf 파일의 default 섹션에 circuit_drawer = mpl 값이 추가됩니다.

    file_path 인수를 지정하지 않으면 현재 사용되는 사용자 구성 파일의 경로(설정된 경우 QISKIT_SETTINGS 환경 변수의 값 또는 기본 위치 ~/.qiskit/settings.conf)가 업데이트됩니다. 그러나 구성 파일은 가져오기 시점에 구문 분석되므로 기존 구성 파일의 변경 사항은 현재 세션에 반영되지 않습니다.

  • 새 상태 클래스를 추가했습니다, StabilizerStateqiskit.quantum_info 모듈에 새로운 상태 클래스를 추가했습니다. 이 클래스는 아론슨과 고트스만(2004) 의 규칙을 사용하여 안정화 시뮬레이터 상태를 나타냅니다.

  • 'value''value_desc' 두 가지 새로운 옵션이 sort kwarg에 추가되었습니다 qiskit.visualization.plot_histogram() 함수에 추가되었습니다. sort 을 이러한 옵션 중 하나로 설정하면 출력 시각화는 각 비트 문자열에 대한 최대 확률을 기준으로 X 축을 정렬합니다. 예를 들어,

    from qiskit.visualization import plot_histogram
    
    counts = {
      '000': 5,
      '001': 25,
      '010': 125,
      '011': 625,
      '100': 3125,
      '101': 15625,
      '110': 78125,
      '111': 390625,
    }
    plot_histogram(counts, sort='value')

알려진 문제점

  • 실행 시 parallel_map() (및 내부적으로 호출하는 함수 parallel_map() 와 같은 transpile()assemble())를 Python 3.9 QISKIT_PARALLEL 을 True로 설정한 상태에서 실행할 때 일부 시나리오에서는 프로그램이 교착 상태에 빠져 실행이 완료되지 않을 수 있습니다. 이러한 문제를 방지하기 위해 Python 3.9 의 기본값이 병렬로 실행되지 않도록 변경되었지만 QISKIT_PARALLEL 을 명시적으로 사용하도록 설정한 경우에도 여전히 이러한 문제가 발생할 수 있습니다.

업그레이드 주의사항

  • Retworkx 종속성의 최소 버전이 버전 0.9.0 으로 증가했습니다. 이는 일부 트랜스파일러 패스의 성능을 개선한 해당 릴리스에 도입된 새로운 API를 사용하기 위한 것입니다.

  • Python 3.9 환경에서 QISKIT_PARALLEL 의 기본값이 False 으로 변경되었으므로 Python 3.9 에서 실행할 때 기본적으로 멀티프로세싱이 사용되지 않습니다. 이는 Python 3.9 (자세한 내용은 알려진 문제 섹션 참조)에서 멀티 프로세싱을 실행할 때 발생할 수 있는 잠재적인 교착 상태/중단 문제를 방지하기 위해 수행되었습니다. QISKIT_PARALLEL 환경 변수를 TRUE 으로 명시적으로 설정하여 수동으로 활성화할 수도 있습니다.

  • qiskit.test.mock 의 기존 가짜 백엔드 클래스는 이제 엄격하게 BackendV1 인터페이스를 엄격하게 구현합니다. 즉, 수동으로 구성하는 경우 QasmQobj 또는 PulseQobjrun() 메서드와 함께 사용하기 위해 객체를 생성했다면 더 이상 작동하지 않습니다. run() 메서드는 QuantumCircuit 또는 Schedule 객체만 허용합니다. 이는 이전에는 키스킷 테라 내에서 테스트가 없던 qobj 없이 구현된 새로운 백엔드의 테스트를 가능하게 하기 위해 필요했습니다. 가짜 백엔드를 활용해야 하는 경우 QasmQobj 또는 PulseQobj 를 사용하여 레거시 공급자 인터페이스를 명시적으로 테스트하기 위해 새로운 가짜 레거시 백엔드 객체가 추가되었습니다. 레거시 인터페이스가 더 이상 사용되지 않고 제거되면 제거됩니다. 앞으로 새로운 가짜 백엔드를 구현할 때는 BackendV1 인터페이스만 구현하며 새로운 가짜 백엔드를 위한 새로운 레거시 백엔드 클래스를 추가하지 않습니다.

  • 잘못된 문자열 레이블이 있는 Pauli 객체를 만들 때 잘못된 문자열 레이블이 있는 경우 QiskitError 가 발생합니다. 이는 유효하지 않은 문자열 레이블에 AttributeError 오류가 발생하던 이전 릴리스에서 변경된 사항입니다. 이 변경은 오류 메시지가 더 많은 정보를 제공하고 일반적인 AttributeError 과 구별되도록 하기 위해 이루어졌습니다.

  • 펄스 빌더의 출력 프로그램 표현(qiskit.pulse.builder.build())의 출력 프로그램 표현이 Schedule 에서 ScheduleBlock. 이 새로운 표현은 시프트 및 삽입과 같은 일부 타이밍 관련 작업을 비활성화합니다. 그러나 이를 통해 빌더 컨텍스트 내에서 매개변수화된 명령어 지속 시간을 사용할 수 있습니다. 예를 들어,

    from qiskit import pulse
    from qiskit.circuit import Parameter
    
    dur = Parameter('duration')
    
    with pulse.build() as sched:
        with pulse.align_sequential():
            pulse.delay(dur, pulse.DriveChannel(1))
            pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0))
    
    assigned0 = sched.assign_parameters({dur: 100})
    assigned1 = sched.assign_parameters({dur: 200})

    지속 시간이 할당된 스케줄을 어셈블러(또는 백엔드)에 직접 전달하거나 양자 회로에 펄스 게이트로 연결할 수 있습니다.

  • 이전에는 선택적 종속성이었던 트위들덤 라이브러리가 필수 종속성이 되었습니다. 이것은 널리 사용되기 때문에 수행되었습니다 PhaseOracle (트위들덤 설치 여부에 따라 다름)의 여러 알고리즘과 함께 qiskit.algorithms.

  • 이전에 pip install qiskit-terra[full-featured-simulators] 같은 것과 함께 qiskit-aer 을 설치하는 데 사용할 수 있었던 선택적 추가 full-featured-simulators 가 qiskit-terra 패키지에서 제거되었습니다. qiskit-terra 대신 qiskit-aer 을 설치하는 데 사용했다면, qiskit 메타패키지를 사용하거나 pip install qiskit-terra qiskit-aer 과 함께 qiskit-terra 및 qiskit-aer 를 설치해야 한다.

  • Linux ( x86_64, aarch64, ppc64le ) 및 macOS 사용자( x86_64, arm64 )를 위한 새로운 요구 사항 심엔진이 추가되었습니다. Windows( 64bit Windows용 사전 컴파일된 패키지로 PyPi 에서 제공) 및 기타 아키텍처에 대한 선택적 종속성입니다. 설치하면 다음과 같은 평가에 대해 크게 향상된 성능을 제공합니다 ParameterParameterExpression 객체의 평가 성능이 향상됩니다.

  • 모든 라이브러리 회로 클래스, 즉 모든 QuantumCircuit 파생 클래스 qiskit.circuit.library의 모든 파생 클래스는 이제 Instruction (또는 Gate로 감싸집니다(단일 클래스인 경우). 예를 들어, 회로를 가져와서 그리는 경우 QFT 회로

    이전에는 다음과 같이 보였습니다

                                              ┌───┐
    q_0: ────────────────────■────────■───────┤ H ├─X─
                       ┌───┐ │        │P/2) └───┘ │
    q_1: ──────■───────┤ H ├─┼────────■─────────────┼─
         ┌───┐ │P/2) └───┘ │P/4)
    q_2: ┤ H ├─■─────────────■──────────────────────X─
         └───┘

    이제 다음과 같이 보입니다

         ┌──────┐
    q_0:0
         │      │
    q_1:1 QFT ├
         │      │
    q_2:2
         └──────┘

    이전 회로를 얻으려면 회로의 decompose() 메서드를 호출하면 됩니다

    이 변경은 주로 일관성을 위해 이루어졌으며, 이 릴리스 이전에는 일부 회로 클래스가 qiskit.circuit.library 의 일부 회로 클래스는 이전에 Instruction 또는 Gate 로 래핑되었지만 전부는 아니었습니다.

지원 중단 노트

  • qiskit.exceptions.QiskitIndexError 클래스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 예외는 키스킷에서 적극적으로 사용되지 않았으며, 사용 중이라면 사용자 정의 예외 클래스를 생성하여 대체할 수 있습니다.
  • epsilonfactr kwarg는 qiskit.algorithms.optimizers.L_BFGS_B 생성자 및 factr kwarg P_BFGS 옵티마이저 클래스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 epsilon 대신 eps karg를 사용하세요. factr kwarg는 ftol 으로 대체됩니다. 이 둘의 관계는 ftol = factr * numpy.finfo(float).eps 입니다. 이 변경은 scipy.optimize.minimize 함수 'L-BFGS-B' 메서드의 사용법과 일관성을 유지하기 위해 이루어졌습니다. 새로운 매개변수 사용 방법에 대한 자세한 내용은 scipy.optimize.minimize(method='L-BFGS-B') 문서를 참조하세요.
  • qiskit.providers.BaseBackend, qiskit.providers.BaseJob, qiskit.providers.BaseProvider 추상 클래스로 구성된 레거시 공급자 인터페이스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 버전이 지정된 인터페이스를 사용해야 하며, 현재 추상 클래스 버전은 qiskit.providers.BackendV1, qiskit.providers.JobV1qiskit.providers.ProviderV1. V1 개체는 대부분 이전 버전과 호환되므로 레거시 인터페이스에서 버전이 변경된 인터페이스로 쉽게 마이그레이션할 수 있습니다. 그러나 추상 인터페이스의 향후 버전은 더 다양해질 것으로 예상됩니다. 버전별 인터페이스에 대한 자세한 내용은 qiskit.providers 문서에서 버전이 지정된 인터페이스에 대한 자세한 내용을 확인할 수 있습니다.
  • condition 콰그는 DAGDepNode 생성자에 해당 condition 어트리뷰트와 함께 DAGDepNode 속성은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 노드가 op 유형인 경우 DAGDepNode.op.condition 을 사용하여 DAGDepNodecondition 에 액세스할 수 있습니다.
  • 클래스의 condition 속성은 DAGNode 클래스의 속성은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신 노드가 op 유형인 경우 DAGNode.op.condition 을 사용하여 DAGNode 객체의 condition 에 액세스할 수 있습니다.
  • 펄스 빌더(qiskit.pulse.builder.build()) 구문 qiskit.pulse.builder.inline() 은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 컨텍스트를 사용하는 대신 인라인 컨텍스트 내에서 정렬 컨텍스트를 제거하면 됩니다.
  • 펄스 빌더(qiskit.pulse.builder.build()) 구문 qiskit.pulse.builder.pad() 은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이는 현재 펄스 빌더가 반환하는 ScheduleBlock.insert 메서드를 지원하지 않기 때문입니다(그리고 빌더에 삽입 구문이 없습니다). 다른 지침의 삽입을 차단하기 위해 시간 슬롯 자리 표시자를 사용하는 것은 더 이상 필요하지 않습니다.

버그 수정

  • 그리고 OneQubitEulerDecomposerTwoQubitBasisDecomposer 클래스가 개선되어 허용 오차를 강화하고, 반복성과 단순성을 개선했으며, 여러 글로벌 위상 추적 버그가 수정되었습니다.

  • 속성을 name 속성을 Gateinverse`() 메서드를 여러 번 호출하여 생성된 속성 할당 문제를 수정했습니다. 이 수정 이전에는 inverse`() 을 호출할 때마다 무조건 _dg 을 추가하여 역으로 호출했습니다. 이 문제가 수정되어 inverse`() 으로 두 번째 호출 시 _dg 접미사가 제거됩니다.

  • 의 사소성 확인 조건을 수정합니다 CZGate, CRZGate, CU1GateMCU1GateHoareOptimizer 패스. 이전에는 어떤 경우에는 옵티마이저가 이러한 게이트를 제거하여 변환의 의미적 동등성을 깨뜨리기도 했습니다.

  • 객체를 변환할 때 발생하는 문제를 수정했습니다 ListOp 객체를 PauliSumOp 객체를 PauliExpectation 또는 AerPauliExpectation. 이전에는 잠재적으로 비용이 많이 드는 폴리 표현으로 변환하는 것에 대한 경고가 표시되었습니다. 내부적으로 이 문제를 해결하기 위해 ListOpSummedOpPauliOp 객체를 생성하는 대신 이제 PauliSumOp 를 생성하여 더 효율적입니다. 수정 #6159

  • 클래스 관련 문제를 수정했습니다 NLocal 모듈의 qiskit.circuit.library 모듈의 클래스에서 잘못된 유형이 reps kwarg에 사용되어 나중에 예기치 않은 런타임 오류가 발생하는 경우 객체 초기화 시 예외를 제대로 발생시키지 않는 문제를 수정했습니다. 이제 reps kwarg가 int 값이 아닌 경우 TypeError 가 올바르게 발생합니다. 수정 #6515

  • 클래스의 TwoLocal 모듈의 qiskit.circuit.library 모듈의 클래스가 널 정수형(예: numpy.int32, numpy.int64, 등)을 entanglement kwarg의 유효한 입력으로 받아들이지 않는 문제를 수정했습니다. 수정 #6455

  • 클래스에 대한 from_qasm_file() 또는 from_qasm_str() 생성자와 함께 OpenQASM2 파일 또는 문자열을 로드할 때 QuantumCircuit 클래스의 OpenQASM2 회로에 delay 이름의 인스트럭션이 포함된 경우, 이는 qiskit.circuit.Delay 인스트럭션에 매핑됩니다. 예를 들어,

    from qiskit import QuantumCircuit
    
    qasm = """OPENQASM 2.0;
    include "qelib1.inc";
    opaque delay(time) q;
    qreg q[1];
    delay(172) q[0];
    u3(0.1,0.2,0.3) q[0];
    """
    circuit = QuantumCircuit.from_qasm_str(qasm)
    circuit.draw()

    수정 #6510

  • 객체 사이의 추가 관련 문제를 수정했습니다 PauliSumOp 객체 사이의 ParameterExpression 계수가 있는 오브젝트 간의 덧셈 문제를 수정했습니다. 이전에는 추가가 올바르게 처리되지 않아 QiskitError 예외가 발생했습니다 ParameterExpression 가 올바르게 처리되지 않았기 때문입니다. 이 문제가 수정되어 다음과 같은 객체 사이에 PauliSumOp 객체 사이에 ParameterExpression 계수가 있는 오브젝트 간에 덧셈을 수행할 수 있도록 수정되었습니다.

  • 클래스 초기화 관련 문제를 수정했습니다 AmplificationProblem 클래스 초기화 문제를 수정했습니다. is_good_state kwarg는 필수 필드였으나 선택 사항으로 잘못 취급되어 문서화되었습니다(그리고 그렇게 문서화되었습니다). 이 문제는 수정되었고 또한 업데이트되어 oracle 입력이 (평가 메서드에 있는) PhaseOracle 객체(평가 메서드에 제공됨)가 아닌 한 필드는 필수이며 is_good_state 없이 구성될 경우 TypeError 이 발생합니다.

  • 컨트롤이 열려 있는 ControlledGate 에 컨트롤을 추가하면 내부의 열린 컨트롤이 설정 해제되던 문제를 수정했습니다. 수정 #5857

  • 메소드 관련 문제를 수정했습니다 convert() 클래스의 PauliExpectation 클래스에서 호출하면 잘못된 결과가 반환되는 문제를 수정했습니다. 수정 #6307

  • 함수 관련 문제를 수정했습니다 qiskit.pulse.transforms.inline_subroutines() 함수가 중첩된 일정에서 호출될 때 중첩된 구성 요소를 모두 제거하지 않던 문제를 수정했습니다. 수정 #6321

  • Python 표준 라이브러리의 functools.partial() 함수로 생성된 부분적으로 바인딩된 콜러블을 schedule kwarg로 전달할 때 발생하는 문제를 수정했습니다 add() 메서드에 InstructionScheduleMap 클래스의 메서드로 전달할 때 이전에는 오류가 발생하던 문제를 수정했습니다. 수정 #6278

  • 문제를 수정했습니다 PiecewiseChebyshev 를 설정할 때 breakpointsNone 으로 설정할 때 중단점으로 잘못 처리되던 문제를 수정했습니다. None 으로 설정하면 전체 간격에 걸쳐 근사치를 구하는 기본 동작으로 다시 전환되도록 수정되었습니다. 수정 #6198

  • 문제를 수정했습니다 num_connected_components() 메서드 QuantumCircuit 메서드가 기존 레지스터에 조건부 게이트가 두 개 이상 포함된 경우 잘못된 구성 요소 수를 반환하던 문제를 수정했습니다. 수정 #6477

  • 상태 함수의 계수가 올바르게 곱해지지 않던 qiskit.opflow.expectations 모듈에서 상태함수의 계수가 올바르게 곱해지지 않던 문제를 수정했습니다. 또한 그라디언트 및 QFI 계산 시 PauliExpectation 또는 AerPauliExpectation 클래스를 사용할 때의 계산도 수정했습니다. 예를 들어, 이전에는

    from qiskit.opflow import StateFn, I, One
    
    exp = ~StateFn(I) @ (2 * One)

    평가된 경우 2 AerPauliExpectation 로, 다른 기대치 변환기의 경우 4 로 보내주세요. ~StateFn(I) @ (2 * One)~(2 * One) @ I @ (2 * One) 의 축약 표기이므로 이제 모든 기대치 변환기에 대해 올바른 계수 4 가 반환됩니다. 수정 #6497

  • PauliOp 에 페이즈가 있을 때 to_circuit() 이 실패하는 버그를 수정했습니다. 동시에 PauliGate 을 사용하는 것이 더 효율적이었습니다.

  • 메서드에 의해 생성된 QASM 출력이 qasm() 메서드에 의해 생성된 QuantumCircuit 와 같은 복합 게이트의 경우 MCXGate 및 그 변형( MCXGrayCode, MCXRecursiveMCXVChain)는 올바르지 않습니다. 이제 회로의 a Gate 에 없는 경우 qelib1.inc, 해당 정의가 출력 QASM 문자열에 추가됩니다. 49433945 수정

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드의 QuantumCircuit. mpl 또는 latex 출력 모드를 사용할 때 cregbundle kwarg를 False 으로 설정하고 reverse_bits kwarg를 True 으로 설정하면 reverse_bitsFalse 으로 설정했을 때와 동일한 순서로 클래식 레지스터의 비트가 표시됩니다.

  • qiskit.extensions.Initialize 명령어를 사용할 때 합성된 정의의 전역 위상이 올바르게 설정되지 않던 문제를 수정했습니다. 수정 #5320

  • 의 비트 순서가 측정된 비트 문자열의 순서와 일치하지 않는 문제를 수정했습니다 qiskit.circuit.library.PhaseOracle.evaluate_bitstring() 의 비트 순서가 측정된 비트 문자열의 순서와 일치하지 않는 문제를 수정했습니다. 이 수정은 또한 오라클이 지정된 경우 Grover 알고리즘 클래스의 실행에도 영향을 미칩니다 PhaseOracle로 지정된 경우에도 이제 올바른 비트 문자열을 올바르게 식별합니다. 수정 #6314

  • 버그 수정 Optimize1qGatesDecomposition() 에서 특정 짧은 시퀀스의 게이트가 잘못 재작성되지 않던 버그를 수정했습니다.

  • qiskit.opflow.gradients.Gradient.gradient_wrapper() 메서드에서 그라데이션 계산 관련 문제를 수정했습니다. 이전에는 연산자가 대각선이 아닌 경우 일부 상황에서 잘못된 결과가 반환되었습니다. 기대치 변환기를 사용하여 결과가 항상 정확한지 확인하여 이 문제를 해결했습니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 draw() 메서드 QuantumCircuit 의 함수와 메서드가 일부 상황에서 클래식 비트가 포함된 사용자 지정 명령어를 잘못 렌더링하는 문제를 수정했습니다. 3201, 3202#6178 수정

  • 의 문제를 수정했습니다 circuit_drawer()draw() 클래스의 QuantumCircuit 클래스의 메서드와 mpl 출력 모드를 사용할 때 제어된 Z 게이트가 비대칭으로 잘못 그려지는 문제를 수정했습니다. 수정 #5981

  • OptimizeSwapBeforeMeasure 트랜스파일러 패스의 일부 상황에서 기존 조건이 포함된 SwapGate 가 제거되는 문제를 수정했습니다. 수정 #6192

  • 클래스의 단계와 관련된 문제를 수정했습니다 qiskit.opflow.gradients.QFI 클래스의 위상 문제를 수정했습니다. qfi_methodlin_comb_full 으로 설정되어 잘못된 옵저버블이 평가되는 문제를 수정했습니다.

  • 문제를 수정했습니다 VQE 알고리즘 클래스와 함께 실행될 때 L_BFGS_B 또는 P_BFGS 옵티마이저 클래스와 그라데이션이 사용될 때 그라데이션이 예상되는 플로트 목록이 아닌 널 배열로 잘못 전달되어 오류가 발생하는 문제를 수정했습니다. 이 문제가 해결되어 그라데이션과 함께 VQEL_BFGS_B 또는 P_BFGS 옵티마이저를 사용할 수 있습니다.

기타 참고사항

  • Instruction 클래스에 대한 parameters() 메서드의 사용 중단이 취소되었습니다. 이 방법은 원래 0.17.0 에서 더 이상 사용되지 않지만 보정 실험을 실행할 때를 포함하여 여러 애플리케이션에서 여전히 필요합니다. 이 방법은 계속 지원되며 제거되지 않습니다.

에어 0.8.2

변경 없음

이그니스 0.6.0

변경 없음

아쿠아 0.9.4

변경 없음

IBM Q 제공자 0.15.0

새 기능

  • 작업이 실패한 경우 이유를 나타내는 문자열을 반환하는 새로운 메서드 qiskit.providers.ibmq.runtime.RuntimeJob.error_message() 에 대한 지원을 추가합니다.

  • 이제 qiskit.providers.ibmq.runtime.IBMRuntimeService.run() 메서드의 입력 매개변수를 자동 완성 기능을 지원하는 qiskit.providers.ibmq.runtime.ParameterNamespace 인스턴스로 지정할 수 있습니다. qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() 을 사용하여 ParameterNamespace 인스턴스를 검색할 수 있습니다.

    예를 들어,

    from qiskit import IBMQ
    
    provider = IBMQ.load_account()
    
    # Set the "sample-program" program parameters.
    params = provider.runtime.program(program_id="sample-program").parameters()
    params.iterations = 2
    
    # Configure backend options
    options = {'backend_name': 'ibmq_qasm_simulator'}
    
    # Execute the circuit using the "circuit-runner" program.
    job = provider.runtime.run(program_id="sample-program",
                               options=options,
                               inputs=params)
  • 이제 사용자는 qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility() 을 사용하여 Qiskit Runtime 프로그램의 공개 여부(비공개/공개)를 설정할 수 있습니다.

  • qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs() 에 선택적 부울 매개변수 pending이 추가되어 상태별로 작업을 필터링할 수 있습니다. 보류 중을 지정하지 않으면 모든 작업이 반환됩니다. 보류 중이 True로 설정되어 있으면 '대기 중' 및 '실행 중' 작업이 반환됩니다. 보류 중이 False로 설정되어 있으면 '완료', '오류', '취소됨' 작업이 반환됩니다.

  • qiskit.providers.ibmq.IBMQBackend.run() 메서드에서 use_measure_esp 플래그에 대한 지원을 추가합니다. True 이면 백엔드는 해당 큐비트에 대한 터미널 명령어인 모든 측정에 ESP 판독값을 사용합니다. 백엔드에서 ESP 판독을 지원하지 않는 경우 오류가 발생합니다.

업그레이드 주의사항

  • qiskit.providers.ibmq.runtime.RuntimeProgram.parameters() 는 이제 qiskit.providers.ibmq.runtime.ParameterNamespace 인스턴스를 반환하는 메서드로, 이를 사용하여 런타임 프로그램 파라미터 값을 채우고 qiskit.providers.ibmq.runtime.IBMRuntimeService.run() 으로 전달할 수 있습니다.
  • 백엔드 구성의 open_pulse 플래그는 더 이상 백엔드가 펄스 수준 제어를 지원하는지 여부를 나타내지 않습니다. 결과적으로 qiskit.providers.ibmq.IBMQBackend.configuration()PulseBackendConfiguration 인스턴스를 반환할 수 있습니다. open_pulse 플래그가 False 인 경우에도 마찬가지입니다.
  • 작업 공유 수준은 채택률이 낮아 더 이상 지원되지 않으며, 해당 인터페이스는 향후 릴리스에서 제거될 예정입니다. 즉, 더 이상 작업을 만들 때 share_level을 전달하거나 qiskit.providers.ibmq.job.IBMQJob.share_level() 메서드를 사용하여 작업의 공유 수준을 가져오지 않아야 합니다.

지원 중단 노트

  • IBM 하드웨어 백엔드에서 id 인스트럭션은 더 이상 사용되지 않습니다. 대신 dt 단위로 지정된 가변 길이 지연을 구현하는 delay 명령어를 사용하세요. id 명령어가 포함된 회로를 실행하면 작업 제출 시 경고가 표시되고 작업의 모든 id 명령어는 자동으로 해당되는 delay 명령어로 대체됩니다.
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.