Skip to main content
IBM Quantum Platform

키스킷 SDK 1.1 릴리즈 노트


1.1.2

Prelude

키스킷 1.1.2 은 1.1 시리즈의 사소한 버그 수정 릴리스입니다.

버그 수정

  • 의 버그를 수정했습니다 BitArray.from_counts()BitArray.from_samples(). 이전에는 0만 포함된 데이터와 선택적 인수 num_bits 에 대한 값이 없는 경우 오류가 발생했습니다. 이제 그들은 BitArrayBitArray.num_bits 를 1로 설정합니다.

  • 에서 누락된 데코레이터를 수정했습니다 C3SXGate 에서 데코레이터가 누락되어 Gate.to_matrix() 가 호출되면 실패하도록 수정했습니다. 이제 게이트 매트릭스가 예상대로 반환됩니다.

  • 누락된 클리포드 게이트를 CollectCliffords 트랜스파일러 패스에 누락된 클리포드 게이트를 추가했습니다. 특히 게이트 ECRGate, DCXGate, iSWAPGate, SXGateSXdgGate 를 이 트랜스파일러 패스에 추가했습니다.

  • 이제 QuantumCircuit.parameters 속성은 이제 파라메트릭 회로에서 QuantumCircuit.copy_empty_like() 를 사용할 때 속성이 올바르게 비워집니다. 이전에는 내부 캐시가 무효화되지 않고 복사되었습니다. 수정 #12617.

  • 기존 근사값을 로드할 때 SolovayKitaev 트랜스파일러 패스를 기존 .npy 파일에서 기본 근사치를 로드할 때 수정합니다. 이전에는 게이트 취소 등으로 인해 추가 감소가 가능한 저장된 근사값을 로드하면 런타임 오류가 발생할 수 있었습니다. 또한 저장-재로드 절차 중에 U(2) 게이트 제품 및 SO(3) 표현의 글로벌 위상차가 손실되었습니다. 수정 Qiskit/qiskit#12576.

  • 관련 문제를 수정했습니다 dag_drawer()DAGCircuit.draw() 인스턴스를 시각화하려고 할 때 DAGCircuit 인스턴스를 시각화하려고 할 때 Var 와이어가 포함된 인스턴스를 시각화하려고 할 때 발생하는 문제를 수정했습니다. 비주얼라이저가 이 작업을 수행하려고 할 때 예외가 발생하는데, 이를 수정하여 예상되는 시각화가 생성되도록 했습니다.

  • 생성자 GenericBackendV2 는 이전에는 백엔드 크기에 따라 할당할 수 없는 베이스 게이트를 허용했기 때문에 잘못된 백엔드를 구성할 수 있었습니다. 예를 들어, 단일 큐비트가 있는 백엔드는 이전에는 2큐비트 게이트가 있는 베이시스를 받아들일 수 있었습니다.

  • OpenQASM 2 파서(qiskit.qasm2)는 이제 64비트 정수에 맞지 않는 정수가 포함된 조건문을 처리할 수 있습니다. 수정 #12773.

  • 이전에는 DAGCircuit.replace_block_with_op()m 큐비트 블록에 n-큐비트 연산을 허용하여 DAG를 유효하지 않은 상태로 유지했습니다. 이 동작이 수정되었으며, 이제 이 동작을 시도하면 DAGCircuitError 가 발생합니다.


1.1.1

Prelude

키스킷 1.1.1 은 1.1 시리즈의 사소한 버그 수정 릴리스입니다.

버그 수정

  • 의 버그를 수정했습니다 Isometry 의 버그를 수정하여 불필요한 어설션으로 인해 UnitaryGate.control() 에 오류를 일으켰던 UnitaryGate 가 두 큐비트보다 많을 때 오류가 발생하던 버그를 수정했습니다.

  • QuantumCircuit.depth() 은 이제 피연산자가 없는 연산, 예를 들어 GlobalPhaseGate.

  • QuantumCircuit.depth() 는 이제 실시간 표현식에 사용된 변수와 클릿을 깊이 계산의 일부로 계산합니다.

  • 인수를 사용하여 draw 함수를 호출할 때 펄스 스케줄을 그리지 않던 qiskit.visualization.pulse_v2.interface.draw() 의 버그를 수정했습니다 BackendV2 인수로 호출할 때 펄스 스케줄을 그리지 않는 버그를 수정했습니다. V2 백엔드는 하드웨어 채널 주파수를 보고하지 않으므로 생성된 도면에는 '주파수 없음'이 표시됩니다 을 각 채널 라벨 아래에 표시합니다.

  • 패스는 VF2Layout 패스는 연결 제약 조건이 없는 Target 인스턴스가 제공되면 예외를 발생시킵니다. Aer 0.13 의 타겟이 이에 해당합니다. 이 문제가 이제 해결되었습니다.

  • ParameterExpressionPython 의 내장 숫자 유형(예: floatint)의 인스턴스와 동일하게 비교되는 완전 바인딩 인스턴스도 다른 인스턴스와 일치하는 해시 값을 갖도록 업데이트되었습니다. 이 변경으로 이러한 유형을 사전 키로 상호 교환하여 사용할 수 있습니다. 12488번을 참조하세요.

  • 가져온 OpenQASM 2 프로그램의 사용자 정의 게이트( gate 문에서 비롯된 게이트)에는 이제 Gate.to_matrix() 구현을 갖게 됩니다. 이전에는 행렬 정의가 없었기 때문에 OpenQASM 2를 통한 라운드 트립은 불필요하게 게이트 행렬을 도출하는 기능을 잃을 수 있었습니다. 하지만 행렬은 다음과 같이 내부 게이트 정의의 행렬을 재귀적으로 찾아서 계산한다는 점에 유의하세요 Operator 가 하는 것처럼 재귀적으로 내부 게이트 정의 행렬을 찾아서 계산하므로 왕복 전보다 성능이 떨어질 수 있습니다.

  • Target.has_calibration() 는 인스트럭션 속성에 None 를 사용하여 대상에 추가된 인스트럭션에 대해 예외를 발생시키지 않도록 업데이트되었습니다. 수정 #12525.


1.1.0

Prelude

키스킷 1.1.0 릴리스는 수많은 새로운 기능과 버그 수정이 포함된 마이너 기능 릴리스입니다. 이번 릴리스의 주요 내용은 다음과 같습니다:

  • 입력된 클래식 변수에 대한 지원이 키스킷의 QuantumCircuit. 이러한 클래식 변수는 입력으로 지정하거나 범위가 지정된 변수로 QuantumCircuit 에 입력 또는 범위 변수로 지정할 수 있으며, 예를 들어 큐비트 측정의 출력을 저장하거나 제어 흐름 연산을 대상으로 합니다. 향후 게이트 파라미터 또는 출력 변수 설정 등에 대한 지원이 추가될 예정입니다.

  • 패스에서 트랜스파일러가 내부적으로 사용하는 기본 두 가지 큐비트 합성 메서드인 UnitarySynthesis 패스에서 트랜스파일러가 내부적으로 사용하는 두 가지 기본 쿼비트 합성 메서드가 Rust에서 다시 구현되었습니다. 이렇게 하면 두 큐비트 유니타리 행렬을 분해할 때 런타임 속도가 크게 향상됩니다. 그 결과, 최적화 레벨 3을 적용한 트랜스파일레이션의 런타임이 크게 개선되었습니다 UnitarySynthesis 을 실행하면 런타임 오버헤드가 크게 발생했습니다. 이 릴리스는 또한 이러한 런타임 성능 개선으로 인해 UnitarySynthesis 을 최적화 레벨 2의 최적화 단계의 일부로 시작하는데, 이러한 런타임 성능 개선이 이루어졌기 때문입니다.

    또한 Isometry 에 사용된 숫자 메서드가 Rust로 이전되어 특히 제어된 단일 게이트 합성에서 런타임 속도를 크게 향상시킬 수 있습니다. 다중 제어에 대한 분해 XGatePhaseGate 의 분해가 개선되어 합성에 사용되는 게이트 수가 두 배 이상 감소했습니다.

  • 많은 경우 트랜스파일링된 양자 회로의 크기를 줄이면서 런타임 속도를 크게 향상시키는 새로운 트랜스파일러 패스가 키스킷에 도입되었습니다. 구체적으로 ElidePermutationsStarPreRouting 는 라우팅 출력 품질과 런타임에 상당한 영향을 미치는 것으로 입증되었으며 RemoveFinalReset 리셋을 포함하는 양자 회로를 개선할 수 있습니다.

  • 기본 패스 관리자는 새로 도입된 트랜스파일러 패스로 확장하여 개선되었습니다. 특히 generate_preset_pass_manager 의 최적화 레벨 2 사전 설정 패스 관리자(내부에서 사용)는 transpile() 가 향후 릴리스에서 기본 패스 관리자로 사용할 수 있도록 런타임과 최적화 노력 간의 균형을 더 잘 맞추도록 리팩토링되었습니다. 이번 릴리스에서는 레벨 2를 사용하도록 기본값이 변경되지는 않았지만 일반적으로 레벨 1 또는 3을 사용하는 것보다 더 나은 선택입니다.

  • 새로운 일반 프리미티브 V2 구현이 추가되었습니다, BackendEstimatorV2BackendSamplerV2를 추가하여 기존의 전체 상태벡터 기반 구현을 보완했습니다.

  • 플랫폼 지원 변경: Python 3.8 은 키스킷 1.1.0 에서 더 이상 지원되지 않으며 1.3.0, arm64 macOS 은 티어 1 지원으로 승격되었습니다.

회로 기능

  • 방법 QuantumCircuit.power(), Gate.power()메서드뿐만 아니라 하위 클래스의 하위 클래스에서 유사한 메서드인 Gate (예 SGate)에는 모두 새로운 인자 annotated 가 추가되어 게이트나 회로에 전원을 인가할 때 AnnotatedOperation 객체를 반환하는 데 사용됩니다. 기본값 False 은 기존 동작에 해당합니다. 또한 명시적으로 정의된 power 메서드가 있는 표준 게이트의 경우 annotated 인수는 효과가 없습니다. 예를 들어 SGate().power(1.5, annotated=False)SGate().power(1.5, annotated=True) 는 모두 PhaseGate 를 반환합니다. 명시적으로 정의된 전원 메서드가 없는 게이트의 경우 annotated 값의 차이가 나타납니다. False 의 값은 이전과 마찬가지로 UnitaryGate를 반환하고, True 의 값은 "파워 수정자"로 수정된 명령을 나타내는 AnnotatedOperation 를 반환하며, 이는 "전원 수정자"로 수정된 명령어를 나타냅니다.

  • 에 새로운 ctrl_state 인수를 추가했습니다 QuantumCircuit.mcp()MCPhaseGate.

    메서드 QuantumCircuit.mcp() 메서드와 MCPhaseGate 클래스가 ctrl_state 매개변수를 포함하도록 업데이트되었습니다. 이 기능을 통해 사용자는 다중 제어 위상 게이트의 제어 상태를 지정할 수 있습니다. 이 매개변수는 정수 값 또는 비트 문자열을 사용할 수 있으며, 제공하지 않으면 기본적으로 '1' 상태를 제어합니다.

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(4)
    qc.mcp(0.2,[0,1,2],3,ctrl_state=2)
  • 에 새로운 ctrl_state 인수를 추가했습니다 QuantumCircuit.mcx().

    양자 회로 라이브러리의 QuantumCircuit.mcx() 메서드가 개선되어 사용자가 다중 제어 X 게이트의 제어 상태를 지정할 수 있는 ctrl_state 파라미터를 포함할 수 있습니다. 이 매개변수는 십진수 값 또는 비트 문자열을 사용할 수 있으며, 제공하지 않으면 기본적으로 '1' 상태를 제어합니다.

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 3)
    qc.mcx([0, 1], 2, ctrl_state="00")
  • A QuantumCircuit 는 이제 입력된 클래식 변수를 포함할 수 있습니다:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
    from qiskit.circuit.classical import expr, types
    
    qr = QuantumRegister(2, "q")
    cr = ClassicalRegister(2, "c")
    qc = QuantumCircuit(qr, cr)
    # Add two input variables to the circuit with different types.
    a = qc.add_input("a", types.Bool())
    mask = qc.add_input("mask", types.Uint(2))
    
    # Test whether the input variable was true at runtime.
    with qc.if_test(a) as else_:
        qc.x(0)
    with else_:
        qc.h(0)
    
    qc.cx(0, 1)
    qc.measure(qr, cr)
    
    # Add a typed variable manually, initialized to the same value as the classical register.
    b = qc.add_var("b", expr.lift(cr))
    
    qc.reset([0, 1])
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(qr, cr)
    
    # Store some calculated value into the `b` variable.
    qc.store(b, expr.bit_and(b, cr))
    # Test whether we had equality, up to a mask.
    with qc.if_test(expr.equal(expr.bit_and(b, mask), mask)):
        qc.x(0)

    이러한 변수는 회로에 대한 입력으로 지정하거나 범위가 지정된 변수로 지정할 수 있습니다. 회로 객체는 아직 유형화된 클래식 변수 출력 표현을 지원하지 않지만, 하드웨어와 결과 인터페이스가 이를 지원할 수 있는 위치에 도달하면 나중에 추가될 예정입니다. 내부 범위의 블록을 나타내는 회로는 외부 범위의 변수를 캡처할 수도 있습니다.

    변수는 이제 임의의 유형을 포함할 수 있는 Var 노드로, 이제 임의의 유형을 포함할 수 있으며 회로에 추가될 때 해당 라이브 범위 내의 고유한 메모리 위치를 나타냅니다. 이들은 다음을 사용하여 회로로 구성할 수 있습니다 QuantumCircuit.add_var()QuantumCircuit.add_input()를 사용하여 회로로 구성하거나 Var.new() 를 사용하여 더 낮은 레벨에서 구성할 수 있습니다.

    변수는 수동으로 저장할 수 있습니다 Store 명령어와 해당 회로 메서드 QuantumCircuit.store(). 여기에는 다음 주소로 ClbitClassicalRegister 인스턴스에 쓰기 및 Var 노드에 쓰기 및 인스턴스 래핑이 포함됩니다.

    변수는 기존 표현식( qiskit.circuit.classical.expr)가 유효한 곳이면 어디에서나 사용할 수 있습니다. 현재는 제어 흐름 연산이 대상 표현식이지만, 향후 유형 및 표현식 시스템이 확장됨에 따라 게이트 매개변수로 확장할 계획입니다.

    이러한 변수와 관련 데이터 모델에 대한 자세한 내용은 실시간 클래식 계산을 참조하세요.

    이는 트랜스파일러 전체에서 QPY 직렬화(qiskit.qpy), OpenQASM 3 내보내기(qiskit.qasm3), 회로 시각화기를 통해 초기 지원됩니다( QuantumCircuit.draw()).

    참고

    새로운 클래식 변수와 스토리지는 하드웨어와 시뮬레이터 백엔드에서 지원되기까지 다소 시간이 걸릴 것입니다. 프리미티브 인터페이스(qiskit.primitives)에서는 지원되지 않지만, 인터페이스가 발전함에 따라 해당 인터페이스에 정보를 제공할 가능성이 높습니다.

  • 고전적인 실시간 표현식 모듈 qiskit.circuit.classical 은 이제 부호 없는 정수와 비트 라이크(예를 들어 ClassicalRegister). 예를 들어, 이제 한 레지스터를 다른 레지스터의 비트 시프트와 비교할 수 있습니다:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister
    from qiskit.circuit.classical import expr
    
    cr1 = ClassicalRegister(4, "cr1")
    cr2 = ClassicalRegister(4, "cr2")
    qc = QuantumCircuit(cr1, cr2)
    with qc.if_test(expr.equal(cr1, expr.shift_left(cr2, 2))):
        pass

    키스킷은 또한 레지스터에 동적으로 색인되는 조건을 나타낼 수도 있습니다:

    with qc.if_test(expr.index(cr1, cr2)):
        pass
  • 의 구성 성능 NLocal 및 그 파생된 회로 라이브러리 서브 클래스(예 EfficientSU2RealAmplitudes)는 회전 및/또는 얽힘 하위 블록이 단일 키스킷 표준 라이브러리 게이트의 간단한 적용일 때 크게 향상되었습니다. 이러한 회로는 느리게 구성되므로 클래스를 인스턴스화할 때 즉시 개선된 것을 볼 수 있는 것이 아니라 내부 구조에 처음 접근할 때 개선된 것을 볼 수 있습니다. 성능 향상 속도는 10배 정도 빨라졌습니다.

  • QuantumCircuit.append() 이제 copy 키워드 인수가 있으며 기본값은 True 입니다. 런타임 파라미터(ParameterExpression)가 있는 명령어가 회로에 추가되면 기본적으로 회로는 항상 명령어의 복사본을 생성하므로, 만약 QuantumCircuit.assign_parameters() 가 명령어를 제자리에서 변경하려고 시도해도 동일한 명령어에 대한 다른 참조에는 영향을 미치지 않습니다. 이제 copy=False 을 설정하면 이를 무시할 수 있으므로 다른 위치에서 지침이 사용되지 않을 경우 복사 불이익을 피할 수 있습니다.

  • QuantumCircuit.compose() 이제 copy 키워드 인수가 있으며 기본값은 True 입니다. 기본적으로 compose() 는 모든 명령을 복사하여 한 회로의 돌연변이가 다른 회로에 영향을 미치지 않도록 합니다. copy=False 이면 다른 회로의 명령어가 새 회로에서 직접 소유하게 되며, 이 경우 해당 명령어를 제자리에서 변경해야 할 수 있습니다. 이 경우 다른 회로는 나중에 사용해서는 안 됩니다.

  • 회로의 건설 시간이 QuantumVolume 회로의 건설 시간이 10x 정도로 크게 개선되었습니다. 내부 SU4 게이트는 이제 생성 중에 더 많은 비트의 무작위성을 사용하므로 특히 폭과 깊이가 큰 경우 더욱 대표적인 볼륨 회로로 이어집니다.

  • QuantumVolume 이제 flatten 키워드 인수가 있습니다. 기본값은 False 이며, 구성된 회로에는 실제 볼륨 구조를 포함하는 단일 인스트럭션이 포함되어 있습니다. True 으로 설정하면 회로에 직접 체적 SU4 행렬이 생깁니다.

  • UnitaryGate 이제 선택적 num_qubits 인수를 허용합니다. 이는 큐비트 수 추론을 건너뛰는 유일한 효과로, 많은 게이트를 구성할 때 성능에 도움이 될 수 있습니다.

  • QuantumCircuit 에는 수동으로 작업하고 검사하는 몇 가지 새로운 메서드가 있습니다 Var 변수를 검사할 수 있습니다.

    이 모든 것에 대한 자세한 내용은 실시간 입력 클래식 데이터로 작업하기를 참조하세요.

    새 메소드는 다음과 같습니다.

    또한 이러한 변수를 둘러싼 몇 가지 새로운 동적 속성을 QuantumCircuit 에 몇 가지 새로운 동적 속성이 추가되었습니다:

  • ControlFlowOp 와 그 서브클래스에는 이제 iter_captured_vars() 메서드가 있으며, 이 메서드는 바로 앞 블록에서 캡처된 고유 변수에 대한 이터레이터를 반환합니다.

  • DAGCircuit 에는 수동으로 작업하고 검사하는 몇 가지 새로운 메서드가 있습니다 Var 변수를 검사할 수 있습니다. 이들은 대체로 QuantumCircuit 와 거의 동일하지만 DAGCircuit 메서드는 이미 정의된 객체를 사용한 프로그래밍 방식 액세스에 최적화되어 있고 QuantumCircuit 메서드는 대화형 인간 사용에 더 중점을 두고 있습니다.

    새 메소드는 다음과 같습니다.

    새로운 공개 속성도 있습니다:

  • DAGCircuit.wires 에도 이제 모든 Var 수동 변수도 회로에 포함할 수 있게 됩니다.

  • 새로운 메서드 Var.new()메서드가 추가되어 메모리를 소유하는 실시간 클래식 변수를 수동으로 구성할 수 있습니다.

  • QuantumCircuit.compose() 에는 실시간 클래식 변수를 더 잘 지원하기 위해 var_remapinline_captures 두 개의 필요 키워드 인수가 있습니다.

    var_remap 를 사용하여 회로 인수의 Var 노드를 다시 작성하는 데 사용할 수 있으며, 명령어가 기본 회로에 인라인 처리됩니다. 이는 이름 충돌을 피하는 데 사용할 수 있습니다.

    inline_capturesTrue (기본값은 False)로 설정하여 인수 회로에서 추적되는 모든 Var 인자 회로에서 "캡처"로 추적된 모든 노드를 기본 회로의 동일한 Var 노드로 연결하여 변수를 다시 선언하지 않아도 됩니다. 이것은 QuantumCircuit.copy_empty_like()vars_mode="captures" 처리와 함께 사용하여 변수를 포함하는 회로를 레이어별로 구축할 수 있습니다.

  • DAGCircuit.compose() 에는 새로운 키워드 인자 inline_captures 가 있으며, True 로 설정하여 인자 회로의 "캡처된" Var 노드를 다시 선언하지 않고 인자 회로의 노드를 기본 회로에 인라인할 수 있습니다. vars_mode="captures" 옵션과 함께 여러 메서드의 DAGCircuit 메서드와 함께 사용하면 동일한 변수에 대해 작동하는 DAG를 결합하는 데 사용할 수 있습니다.

  • QuantumCircuit.copy_empty_like()DAGCircuit.copy_empty_like() 에는 새로운 키워드 인자 vars_mode 가 있어 메모리를 소유하는 모든 Var 노드가 출력에서 추적되는 방식을 제어합니다. 기본적으로("alike"), 변수는 소스와 동일한 입력/캡쳐/로컬 모드로 선언됩니다. "captures" 로 설정하여 모든 변수를 캡처로 변환하거나( compose()) 또는 "drop" 으로 설정하여 제거할 수 있습니다.

  • 메소드에 새로운 vars_mode 키워드 인수가 추가되었습니다 DAGCircuit 메서드에 추가되었습니다:

    와 같은 의미를 갖는 copy_empty_like().

  • 회로 라이브러리의 모든 "표준 게이트"(qiskit.circuit.library)의 얽힘 연산에 대해 이제 문자열 이름으로 지정할 수 있습니다 TwoLocal 회로의 얽힘 연산에 대해 RealAmplitudesEfficientSU2.

기본형 기능

  • 구현 BackendEstimatorV2 의 구현 BaseEstimatorV2 구현이 추가되었습니다. 이 추정기는 다음을 지원합니다 BackendV1BackendV2.

    import numpy as np
    from qiskit import transpile
    from qiskit.circuit.library import IQP
    from qiskit.primitives import BackendEstimatorV2
    from qiskit.providers.fake_provider import Fake7QPulseV1
    from qiskit.quantum_info import SparsePauliOp, random_hermitian
    
    backend = Fake7QPulseV1()
    estimator = BackendEstimatorV2(backend=backend)
    n_qubits = 5
    mat = np.real(random_hermitian(n_qubits, seed=1234))
    circuit = IQP(mat)
    observable = SparsePauliOp("Z" * n_qubits)
    isa_circuit = transpile(circuit, backend=backend, optimization_level=1)
    isa_observable = observable.apply_layout(isa_circuit.layout)
    job = estimator.run([(isa_circuit, isa_observable)], precision=0.01)
    result = job.result()
    print(f"> Expectation value: {result[0].data.evs}")
    print(f"> Standard error: {result[0].data.stds}")
    print(f"> Metadata: {result[0].metadata}")
  • 구현 BackendSamplerV2 의 구현 BaseSamplerV2 구현이 추가되었습니다. 이 샘플러는 다음을 지원합니다 BackendV1BackendV2 를 지원하여 memory 옵션으로 비트스트링을 계산할 수 있습니다.

    import numpy as np
    from qiskit import transpile
    from qiskit.circuit.library import IQP
    from qiskit.primitives import BackendSamplerV2
    from qiskit.providers.fake_provider import Fake7QPulseV1
    from qiskit.quantum_info import random_hermitian
    
    backend = Fake7QPulseV1()
    sampler = BackendSamplerV2(backend=backend)
    n_qubits = 5
    mat = np.real(random_hermitian(n_qubits, seed=1234))
    circuit = IQP(mat)
    circuit.measure_all()
    isa_circuit = transpile(circuit, backend=backend, optimization_level=1)
    job = sampler.run([isa_circuit], shots=100)
    result = job.result()
    print(f"> bitstrings: {result[0].data.meas.get_bitstrings()}")
    print(f"> counts: {result[0].data.meas.get_counts()}")
    print(f"> Metadata: {result[0].metadata}")
  • 다양한 축을 따라 여러 BitArray 오브젝트를 여러 축에 결합하는 메서드를 추가했습니다.

    ba = BitArray.from_samples(['00', '11'])
    print(ba)
    # BitArray(<shape=(), num_shots=2, num_bits=2>)
    
    # reshape the bit array because `concatenate` requires an axis.
    ba_ = ba.reshape(1, 2)
    print(ba_)
    # BitArray(<shape=(1,), num_shots=2, num_bits=2>)
    
    ba2 = BitArray.concatenate([ba_, ba_])
    print(ba2.get_bitstrings())
    # ['00', '11', '00', '11']
    
    # `concatenate_bits` and `concatenates_shots` do not require any axis.
    
    ba3 = BitArray.concatenate_bits([ba, ba])
    print(ba3.get_bitstrings())
    # ['0000', '1111']
    
    ba4 = BitArray.concatenate_shots([ba, ba])
    print(ba4.get_bitstrings())
    # ['00', '11', '00', '11']
  • 객체의 하위 집합을 생성하는 메서드가 추가되었습니다 BitArray 객체의 하위 집합을 생성하는 메서드를 추가했습니다.

    • __getitem__()배열의 기존 축을 따라 배열을 슬라이스합니다.
    • slice_bits(): 비트 축을 따라 배열을 슬라이스합니다.
    • slice_shots()샷 축을 따라 배열을 슬라이스합니다.
    ba = BitArray.from_samples(['0000', '0001', '0010', '0011'], 4)
    print(ba)
    # BitArray(<shape=(), num_shots=4, num_bits=4>)
    print(ba.get_bitstrings())
    # ['0000', '0001', '0010', '0011']
    
    ba2 = ba.reshape(2, 2)
    print(ba2)
    # BitArray(<shape=(2,), num_shots=2, num_bits=2>)
    print(ba2[0].get_bitstrings())
    # ['0000', '0001']
    print(ba2[1].get_bitstrings())
    # ['0010', '0011']
    
    ba3 = ba.slice_bits([0, 2])
    print(ba3.get_bitstrings())
    # ['00', '01', '00', '01']
    
    ba4 = ba.slice_shots([0, 2])
    print(ba3.get_bitstrings())
    # ['0000', '0010']
  • 메서드 추가 transpose() 를 전치하는 메서드 BitArray.

    ba = BitArray.from_samples(['00', '11']).reshape(2, 1, 1)
    print(ba)
    # BitArray(<shape=(2, 1), num_shots=1, num_bits=2>)
    print(ba.transpose())
    # BitArray(<shape=(1, 2), num_shots=1, num_bits=2>)
  • 대각선 연산자의 기대값을 계산하는 메서드 expectation_values() 메서드를 추가하여 대각선 연산자의 기대값을 계산합니다.

    ba = BitArray.from_samples(['01', '11'])
    print(ba.expectation_values(["IZ", "ZI", "01"]))
    # [-1.   0.   0.5]
  • DataBin 이제 Shaped 프로토콜을 충족합니다. 즉, 이제 모든 DataBin 인스턴스에는 이제 추가 속성이 있습니다

    • shape (투플린트[,...])인스턴스의 모든 항목의 선행 모양입니다
    • ndim (int): 길이 shape
    • size (int): 다음 항목의 곱입니다 shape

    생성자에게 모양을 전달할 수 있습니다.

  • 에 매핑과 유사한 기능을 추가했습니다 DataBin, 즉 __getitem__, __contains__, __iter__, keys(), values()items().

    from qiskit import QuantumCircuit
    from qiskit.primitives import StatevectorSampler
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    circuit.measure_all()
    
    sampler = StatevectorSampler()
    result = sampler.run([circuit]).result()
    databin = result[0].data
    for creg, arr in databin.items():
        print(creg, arr)
    for creg in databin:
        print(creg, databin[creg])
  • 서브클래스 SamplerPubResult 의 서브클래스 PubResult 의 서브클래스가 추가되었습니다 BaseSamplerV2 구현이 반환할 수 있습니다. 이 새로운 서브클래스에 추가된 주요 기능은 join_data()의 내용( 하위 집합)을 하나의 객체로 결합하는 함수입니다 data 의 내용을 하나의 객체로 결합합니다. 이를 통해 다음과 같은 패턴을 사용할 수 있습니다:

    job_result =  sampler.run([pub1, pub2, pub3], shots=123).result()
    
    # assuming all returned data entries are BitArrays
    counts1 = job_result[0].join_data().get_counts()
    bistrings2 = job_result[1].join_data().get_bitstrings()
    array3 = job_result[2].join_data().array

제공자 기능

  • 파이썬 기반 시뮬레이터에 포함된 BasicSimulator 에 포함된 파이썬 기반 시뮬레이터 basic_provider 에 포함된 파이썬 기반 시뮬레이터는 이제 최대 3 큐비트까지 모든 표준 게이트 실행을 지원합니다 qiskit.circuit.library.

펄스 기능

  • 이제 펄스에 매개변수를 할당할 수 있습니다 ScheduleScheduleBlock 객체에 매개변수 이름을 문자열로 지정하여 매개변수를 할당할 수 있습니다. 매개변수 이름은 모든 매개변수에 값을 할당하는 데 사용할 수 있습니다 Schedule 또는 ScheduleBlock 안에 있는 동일한 이름을 가진 모든 매개변수에 값을 할당할 수 있습니다. 또한 매개변수 이름인 ParameterVector 를 사용하여 벡터의 모든 값을 동시에 할당할 수 있습니다(따라서 값 목록은 벡터의 길이와 일치해야 합니다).

  • assign_parametersScheduleScheduleBlock 의 메서드는 이제 매개변수 값 목록에 ParameterVector 를 매개변수 값 목록에 동시에 할당할 수 있게 되었습니다 Parameter 인스턴스를 할당할 수 있습니다.

OpenQASM 기능

  • OpenQASM 3 익스포터는 회로의 수동 저장 Var 노드를 지원합니다.

QPY 기능

  • QPY(qiskit.qpy) 형식 버전 12가 추가되었으며, 메모리 소유 Var 변수를 지원합니다. 변경된 형식에 대한 자세한 내용은 버전 12를 참조하세요.

양자 정보 특성

  • 새로운 apply_layout() 메서드에 해당하는 apply_layout(). 이 메서드는 트랜스파일러에서 TranspileLayout 트랜스파일러의 레이아웃을 Pauli 옵저버블에 레이아웃을 적용하는 데 사용됩니다. 이렇게 하면 BaseEstimator / BaseEstimatorV2 구현과 입력이 타입이 Pauli. 예를 들어,

    from qiskit.circuit.library import RealAmplitudes
    from qiskit.primitives import BackendEstimatorV2
    from qiskit.providers.fake_provider import GenericBackendV2
    from qiskit.quantum_info import Pauli
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    psi = RealAmplitudes(num_qubits=2, reps=2)
    H1 = Pauli("XI")
    backend = GenericBackendV2(num_qubits=7)
    estimator = BackendEstimatorV2(backend=backend)
    thetas = [0, 1, 1, 2, 3, 5]
    pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
    transpiled_psi = pm.run(psi)
    permuted_op = H1.apply_layout(transpiled_psi.layout)
    res = estimator.run([(transpiled_psi, permuted_op, thetas)]).result()

    로 전달되기 전에 입력 회로가 로컬에서 트랜스파일링되는 경우 run() 로 전달됩니다. 트랜스필레이션은 원래 회로를 2 큐비트에서 7 큐비트( backend 의 크기)로 확장하고 그 레이아웃을 퍼뮤트한 다음 H1apply_layout() 를 사용하여 pm.run() 에 의해 수행된 변환을 반영합니다.

  • 추가 PauliList.noncommutation_graph()SparsePauliOp.noncommutation_graph() 메서드를 추가하여 비교차 그래프의 구성을 노출하고 측정 연산자 그룹화 문제를 그래프 색칠 문제로 재구성합니다. 이를 통해 사용자는 이러한 그래프로 직접 작업할 수 있습니다(예: 색 지정 알고리즘을 탐색하기 위해 SparsePauliOp.group_commuting().

  • 의 성능이 SparsePauliOp.to_matrix() 의 성능이 밀집형과 희소형 모두에서 크게 향상되었습니다. 이제 기본적으로 두 가지 모두 RAYON_NUM_THREADS 환경 변수에 따라 시스템에서 사용 가능한 스레드 병렬 처리를 활용합니다. 새로운 force_serial 부울 인수를 사용하여 일시적으로 직렬 실행을 강제할 수 있습니다 to_matrix().

합성 기능

  • 합성용 KMSSynthesisLinearFunction 객체 합성을 위한 LinearFunction 객체 합성 플러그인은 이제 두 가지 추가 옵션 use_inverteduse_transposed 을 허용합니다. 이 옵션은 기본 합성 알고리즘이 실행되는 매트릭스를 반전 및/또는 전치하여 수정한 다음 합성된 회로를 적절히 조정합니다. 이러한 옵션을 변경하면 일반적으로 다른 합성 회로를 얻을 수 있으며 경우에 따라 기본값보다 더 나은 결과를 얻을 수 있습니다.

  • 합성용 PMHSynthesisLinearFunction 합성용 플러그인 LinearFunction 객체를 합성하는 플러그인은 이제 몇 가지 추가 옵션을 허용합니다. section_size 옵션은 기본 합성 메서드에 전달됩니다. use_inverteduse_transposed 옵션은 기본 합성 알고리즘이 실행되는 행렬을 반전 및/또는 전치하여 수정한 다음 합성 회로를 적절히 조정합니다. 이러한 옵션을 변경하면 일반적으로 다른 합성 회로를 얻을 수 있으며 경우에 따라 기본값보다 더 나은 결과를 얻을 수 있습니다.

  • 에 새 인수 use_dag 를 추가했습니다 TwoQubitBasisDecomposer.__call__()XXDecomposer.__call__() 메서드에 새로운 인수를 추가했습니다. 이 인수는 호출 시 DAGCircuit 를 호출할 때 반환되는 TwoQubitBasisDecomposer 또는 XXDecomposer 인스턴스를 호출할 때 기본값 QuantumCircuit. 예를 들어,

    from qiskit.circuit.library import CXGate
    from qiskit.quantum_info import random_unitary
    from qiskit.synthesis import TwoQubitBasisDecomposer
    
    decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="PSX")
    decomposer(random_unitary(4), use_dag=True)

    DAGCircuit 를 반환합니다 TwoQubitBasisDecomposer 인스턴스 decomposer.

  • LieTrotter.synthesize() 이제 QuantumCircuit.repeat() 를 사용하여 첫 번째 트로터 스텝 이후 트로터 스텝의 추가 반복을 생성합니다. 이렇게 하면 호출 수가 QuantumCircuit.compose() 호출 수를 reps 만큼 줄이고 대규모 운영자의 런타임을 크게 줄입니다.

  • 새로운 합성 방법 추가 synth_permutation_reverse_lnn_kms() 를 사용하여 선형 최접근 이웃 아키텍처에 대한 역순열의 새로운 합성 방법을 추가합니다. 이 알고리즘은 깊이가 있는 CX 게이트를 사용하여 선형 최인접 이웃 아키텍처를 통해 nn 큐비트에 대한 역순열을 합성합니다( 2n+22 * n + 2 ).

  • 클래스가 TwoQubitBasisDecomposer 클래스가 Rust로 재작성되어 런타임 성능이 크게 향상되었습니다.

  • 합성 클래스는 TwoQubitWeylDecomposition 합성 클래스는 성능 향상을 위해 Rust에서 재작성되었습니다.

트랜스파일러 기능

  • CommutationChecker 에서 수행하던 정류 분석을 추상 회로에서도 작동하도록 확장했습니다. 즉, 이제 분석 단계를 진행하기 전에 입력된 양자 회로의 각 연산이 행렬로 표현되는지 확인합니다. 이전에는 정류 분석이 물리적 회로에서만 수행되었습니다. 또한 각 연산은 이제 세션 커뮤테이션 라이브러리에서 캐시할 수 있는지 확인합니다. 예를 들어, 이제 다음을 계산할 수 있습니다 AnnotatedOperation 출퇴근. 이렇게 하면 다음과 같이 내부적으로 CommutationChecker 에 의존하는 트랜스파일러 패스를 사용할 수 있습니다 CommutativeCancellation와 같은 기본 트랜스파일러 파이프라인의 초기 단계(기준 번역 이전)에서 실행할 수 있습니다.

  • 트랜스파일러 패스 ElidePermutations 는 최적화 레벨 2와 3을 위해 초기화 단계에서 기본적으로 실행됩니다. 직관적으로, 제거 SwapGatePermutationGate를 제거하면 회로를 더 짧고 쉽게 라우팅할 수 있으므로 거의 항상 이점이 있습니다. OptimizeSwapBeforeMeasure 는 특수한 경우이므로 ElidePermutations의 특수한 경우이므로 최적화 레벨 3 패스 관리자의 초기화 단계의 일부로 ElidePermuations 패스로 대체되었습니다.

  • 새로운 최적화 트랜스파일러 패스를 추가했습니다, ElidePermutations레이아웃 단계 이전에 실행되도록 설계되어 모든 SwapGatePermutationGate를 가상 큐비트를 순열하여 회로에서 최적화합니다. 예를 들어, 다음과 같은 회로를 예로 들어 보겠습니다 SwapGates:

    _images/release_notes-1.png

    패스가 실행될 때 스왑을 제거합니다:

    from qiskit.transpiler.passes import ElidePermutations
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3)
    qc.h(0)
    qc.swap(0, 1)
    qc.swap(2, 0)
    qc.cx(1, 0)
    qc.measure_all()
    
    ElidePermutations()(qc).draw("mpl")
    _images/release_notes-2.png

    이 패스는 또한 virtual_permutation_layout 속성 세트를 설정하여 최적화한 회로의 끝에 가상 큐비트의 순열을 저장합니다.

  • 이제 HLSConfig 에는 이제 두 개의 추가 선택 인수가 있습니다. plugin_selection 인수는 "sequential" 또는 "all" 로 설정할 수 있습니다. "순차적"(기본값)으로 설정하면 모든 상위 수준 객체에 대해 HighLevelSynthesis 패스는 지정된 메서드를 목록에 나타나는 순서대로 순차적으로 고려하고, 객체를 합성할 수 있는 첫 번째 메서드에서 중지합니다. "모두"로 설정하면 지정된 모든 방법이 고려되며 plugin_evaluation_fn 에 따라 가장 적합한 합성 회로가 선택됩니다. plugin_evaluation_fn 인수는 합성된 양자 회로의 품질을 평가하는 선택적 콜러블로, 값이 작을수록 더 나은 회로를 의미합니다. None 로 설정하면 회로의 품질은 크기(즉, 회로에 포함된 게이트 수)입니다.

    다음 예는 새로운 기능을 설명합니다:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library import LinearFunction
    from qiskit.synthesis.linear import random_invertible_binary_matrix
    from qiskit.transpiler.passes import HighLevelSynthesis, HLSConfig
    
    # Create a circuit with a linear function
    mat = random_invertible_binary_matrix(7, seed=37)
    qc = QuantumCircuit(7)
    qc.append(LinearFunction(mat), [0, 1, 2, 3, 4, 5, 6])
    
    # Run different methods with different parameters,
    # choosing the best result in terms of depth.
    hls_config = HLSConfig(
        linear_function=[
            ("pmh", {}),
            ("pmh", {"use_inverted": True}),
            ("pmh", {"use_transposed": True}),
            ("pmh", {"use_inverted": True, "use_transposed": True}),
            ("pmh", {"section_size": 1}),
            ("pmh", {"section_size": 3}),
            ("kms", {}),
            ("kms", {"use_inverted": True}),
        ],
        plugin_selection="all",
        plugin_evaluation_fn=lambda circuit: circuit.depth(),
    )
    
    # synthesize
    qct = HighLevelSynthesis(hls_config=hls_config)(qc)

    이 예제에서는 다양한 파라미터를 사용하여 여러 합성 방법을 실행하여 깊이 측면에서 가장 적합한 회로를 선택합니다. circuit.size() 대신 최적화하면 다른 회로를 선택하게 됩니다.

  • 최적화 레벨 2와 3을 위해 사전 설정 패스 관리자의 CommutativeCancellation 패스를 사전 설정 패스 관리자의 init 단계에 최적화 레벨 2 및 3에 추가했습니다. 이를 통해 프리셋 패스 관리자는 컴파일 파이프라인의 시작 부분에서 추가 논리 연산을 취소할 수 있습니다.

  • 이제 다음 분석 패스는 다음과 같이 인코딩된 제약 조건을 허용합니다 Targettarget 로 인코딩된 제약 조건을 허용합니다:

    타깃 제약 조건은 나머지 트랜스파일러 파이프라인과의 일관성을 위해 사용자가 제공한 제약 조건보다 우선순위를 갖습니다.

  • 새로운 메서드 Layout.inverse() 메서드를 추가했습니다 Layout 객체의 역을 취하는 데 사용되는 새로운 메서드를 추가했습니다. 새로운 메서드 추가 Layout.compose() 두 개의 객체를 함께 구성하는 데 사용되는 Layout 객체를 함께 구성하는 데 사용되는 새로운 메서드를 추가했습니다. 새로운 메서드 Layout.to_permutation() 메서드가 추가되었습니다 Layout 객체에 해당하는 순열을 만드는 데 사용되는 새로운 메서드를 추가했습니다.

  • 트랜스파일러 패스에 새로운 감소가 추가되었습니다 OptimizeAnnotated 트랜스파일러 패스에 새로운 감소 효과를 추가했습니다. 이 축소는 주석이 달린 연산(타입이 AnnotatedOperation 기본 연산 BB 및 제어, 역 및 거듭제곱 수정자 목록 MM 으로 구성된 객체)을 다음 속성을 가진 연산으로 검색합니다:

    • 기본 연산 BB 을 합성해야 합니다(즉, 대상에서 이미 지원하지 않거나 동등성 라이브러리에 속하지 않음)
    • BB 의 정의 회로는 PP - QQ - RR 로 표현할 수 있습니다 R=P1R = P^{-1}

    이 경우 수정자는 QQ -부분으로만 이동할 수 있습니다. 구체적인 예로, 제어된 QFT 기반 가산기의 형식은 control - [QFT -- U -- IQFT] 이며, QFT -- control-[U] -- IQFT 으로 단순화할 수 있습니다. 회로의 QFTIQFT 부분에 대한 제어를 제거하면 트랜스파일된 회로에서 훨씬 더 적은 수의 게이트를 얻을 수 있습니다.

  • 클래스에 두 가지 새로운 메서드를 추가했습니다 DAGCircuit 클래스에 두 개의 새로운 메서드를 추가했습니다: qiskit.dagcircuit.DAGCircuit.op_successors() 노드의 후속 노드에 대한 DAGOpNode 노드의 후계자에게 반복자를 반환하고 qiskit.dagcircuit.DAGCircuit.op_successors() 이터레이터를 노드의 DAGOpNode 노드의 전임자에게 이터레이터를 반환합니다.

  • 새로운 트랜스파일러 패스를 추가했습니다, RemoveFinalReset를 추가하여 큐비트 와이어의 최종 명령어인 Reset 연산을 제거합니다. 예를 들어, 최종 Resets:

    _images/release_notes-3.png

    패스를 실행하면 최종 초기화가 제거됩니다:

    from qiskit.transpiler.passes import RemoveFinalReset
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3, 1)
    qc.reset(0)
    qc.h(range(3))
    qc.cx(1, 0)
    qc.measure(0, 0)
    qc.reset(range(3))
    RemoveFinalReset()(qc).draw("mpl")
    _images/release_notes-4.png
  • 새로운 트랜스파일러 패스 추가 StarPreRouting 스타 연결 하위 회로를 식별한 다음 최적의 선형 라우팅으로 대체하도록 설계되었습니다. 이는 번스타인-바지라니 및 QFT와 같이 이 회로 연결로 구성된 특정 회로에 유용합니다. 예를 들어,

    _images/release_notes-5.png
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import StarPreRouting
    
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, range(1, 5))
    StarPreRouting()(qc).draw("mpl")
    _images/release_notes-6.png

    또는 기존 사전 설정 패스 관리자를 확장할 수도 있습니다:

    from qiskit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.transpiler.passes import StarPreRouting
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    cm = CouplingMap.from_line(5)
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, range(1, 5))
    pm = generate_preset_pass_manager(2, coupling_map=cm)
    pm.init += StarPreRouting()
    result = pm.run(qc)
    result.draw("mpl")
    _images/release_notes-7.png

시각화 기능

  • 텍스트 및 Matplotlib 회로 서랍(QuantumCircuit.draw())는 수동 실시간 변수가 포함된 표현식을 표시하는 데 최소한의 지원만 제공합니다. 연산과 변수 초기화는 아직 지원되지 않습니다 Store 연산과 변수 초기화는 아직 지원되지 않으며, 대규모 동적 회로의 경우 OpenQASM 3 내보내기 기능(qasm3.dumps())을 사용하여 회로의 텍스트 표현을 가져오는 것이 좋습니다.

기타 기능

  • 이번 키스킷 릴리스는 NumPy 2.0 에 대한 지원을 마무리합니다. 키스킷은 당분간 NumPy 1.x 및 2.x 을 계속 지원할 예정입니다.

업그레이드 주의사항

  • 에 대한 스타일 옵션의 하드 코딩을 제거합니다 plot_histogram(). 이렇게 하면 Matplotlib 스타일 파일을 그림에 충실하게 적용할 수 있습니다. Matplotlib 에서 설정한 기본값을 넘어서고 싶은 사용자는 직접 스타일 파일을 만들거나 Matplotlib Axes 객체를 plot_histogram 에 전달하고 사용자 지정을 사후에 적용할 수 있습니다.

  • 함수는 transpile() 함수는 내부적으로 백엔드 입력 유형을 BackendV1BackendV2로 변환하여 이제 트랜스필레이션 파이프라인에서 Target. 이 변경에는 사용자 조치가 필요하지 않습니다.

회로 업그레이드 노트

  • 의 난수 사용법이 변경되었습니다 QuantumVolume 의 난수 사용이 변경되었으므로 이전 버전의 키스킷과 이 버전 간에 고정 시드를 위한 다른 회로를 얻게 됩니다. 무작위 단위 생성은 이제 더 많은 비트의 엔트로피를 사용하므로 대형 회로의 편향이 줄어듭니다.

  • 내부 UnitaryGate 정의의 인스턴스에는 QuantumVolume 회로 정의의 내부 인스턴스에는 더 이상 label 필드 세트가 없습니다. 이전에는 su4_<seed> 문자열로 설정되었으며, 여기서 <seed> 은 해당 게이트에 대한 내부 Numpy pRNG 인스턴스의 시드를 나타내는 세 자리 숫자였습니다. 이렇게 하면 심각한 성능 문제가 발생하고 시드가 유용하지 않아야 합니다. 게이트에서 행렬을 검색해야 하는 경우 간단히 Gate.to_matrix() 메서드를 사용하면 됩니다.

기본형 업그레이드 노트

  • make_data_bin() 함수는 더 이상 생성하고 반환하지 않습니다 DataBin 서브클래스를 생성하고 반환하지 않습니다. 대신 항상 항상 DataBin 클래스를 반환합니다. 그러나 이전 버전과의 호환성을 위해 계속 존재하지만 결국 더 이상 사용되지 않을 것입니다. 모든 사용자는 인스턴스를 직접 생성하도록 마이그레이션해야 합니다 DataBinmake_data_bin() 의 출력으로 서브클래스를 인스턴스화하는 대신 직접 인스턴스화해야 합니다.

공급자 업그레이드 안내

  • 의 구현 BackendV2 (및 BackendV1)의 구현은 run() 메서드를 업데이트하여 타입이 지정된 클래식 변수가 포함된 입력을 열심히 거부할 수 있습니다( qiskit.circuit.classical) 및 Store 인스트럭션을 지원하지 않는 경우). 새로운 Store 명령어는 트랜스파일러에서 항상 사용 가능한 "지시어"( Barrier); 백엔드가 지원하지 않는 경우, 이 명령어는 transpiler.

    자세한 내용은 실시간 변수를 참조하세요.

QPY 업그레이드 노트

합성 업그레이드 노트

  • 더 이상 TwoQubitWeylDecomposition 는 더 이상 생성 시 서브클래스로 자체 특화되지 않습니다. 이것은 이전에 TwoQubitWeylDecomposition 의 내부 세부 사항이었으며, 모든 서브클래스가 동일하게 동작하고 내부 디스패치에만 사용되었기 때문에 문서화된 공개 동작은 아니었습니다. 그러나 이 릴리스 노트는 발견 가능한 동작이었기 때문에 더 이상 이러한 동작이 발생하지 않으며 모든 인스턴스의 TwoQubitWeylDecomposition 의 모든 인스턴스는 동일한 유형이 될 것입니다. 클래스의 공용 메서드에 대한 동작은 변경되지 않습니다.

트랜스파일러 업그레이드 노트

  • 프리셋 StagedPassManager 은 최적화 레벨 2에 대해 generate_preset_pass_manager()level_2_pass_manager() 가 런타임과 최적화 사이의 균형을 개선하기 위해 재작업되었습니다. 즉, 이전 릴리스와 비교하여 출력 회로가 변경됩니다. 이전 릴리스의 레벨 2에서 정확한 패스 관리자가 필요한 경우 수동으로 빌드하거나 이전 릴리스에서 사용하고 회로를 저장한 후 qpy 를 사용하여 회로를 저장하여 최신 릴리스에서 로드할 수 있습니다.

기타 업그레이드 주의사항

  • 이제 지원되는 Windows의 최소 버전은 Windows 10입니다. 이전 릴리스에서는 지원되는 최소 Windows 버전을 명시적으로 나열하지 않았으며 암시적으로 Windows 7, 8 및 8.1 이 작동했을 수 있습니다(테스트되지 않음). 그러나 Rust 1.78 가 이전 버전의 Windows에 대한 지원을 중단함에 따라 PyPI 에 게시된 키스킷의 바이너리는 이번 릴리스부터 이전 버전의 Windows를 지원하지 않습니다. 이전 버전의 Windows를 사용하는 경우 이전 버전의 Rust 컴파일러를 사용하여 소스에서 키스킷을 빌드할 수 있지만(현재 소스에서 빌드할 때 지원되는 키스킷의 최소 Rust 버전은 1.70 ), 이전 버전의 Windows는 지원되는 플랫폼이 아니며 테스트되지 않았습니다.

지원 중단 노트

  • Python 3.8 으로 키스킷 실행에 대한 지원은 더 이상 사용되지 않으며, 키스킷 1.3.0 릴리스에서 제거될 예정입니다. 1.3.0 은 Python 3.8 이 수명이 종료되어 더 이상 지원되지 않는 후 첫 번째 릴리스입니다. [1] 즉, 1.3.0 릴리스부터는 사용 중인 Python 버전을 Python 3.9 이상으로 업그레이드해야 합니다.

    [1] https://devguide.python.org/versions/

제공자 기능 폐기

  • 추상 베이스 클래스 ProviderProviderV1 는 이제 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 인터페이스 정의가 제공하는 추상화는 실질적인 가치를 제공하지 않았으며 name, backends, get_backend() 속성을 캡슐화했을 뿐입니다. 개념상 _공급자_는 백엔드 모음으로 계속 존재할 것입니다. 현재 공급자를 구현 중인 경우 구현의 부모 클래스로 ProviderV1 을 제거하여 코드를 조정할 수 있습니다. 이 일환으로 이전 버전과의 호환성을 위해 get_backend 구현을 추가하고 싶을 것입니다. 예를 들어,

    def get_backend(self, name=None, **kwargs):
      backends = self.backends(name, **kwargs)
      if len(backends) > 1:
          raise QiskitBackendNotFoundError("More than one backend matches the criteria")
      if not backends:
          raise QiskitBackendNotFoundError("No backend matches the criteria")
      return backends[0]

합성 기능의 사용 중단

  • 메서드 TwoQubitWeylDecomposition.specialize() 메서드는 이제 더 이상 사용되지 않으며 키스킷 2.0.0 릴리스에서 제거될 예정입니다. 이 메서드는 공개 목적이 없었으며 최종 사용자가 객체에서 계산된 분해를 변경하고 객체에 잘못된 필드를 생성하므로 호출하기에 안전하지 않았습니다. 내부적으로만 새 객체를 구성하는 데 사용되었습니다 TwoQubitWeylDecomposition 객체를 생성할 때만 사용됩니다. 그럼에도 불구하고 이 클래스는 여전히 공용 API의 문서화된 부분이었으며, 현재는 대체할 수 있는 방안 없이 사용되지 않습니다. 이번 릴리스에서는 클래스의 Rust 재작성의 일부로 전문화 서브클래싱이 제거되었으므로 호출 시 항상 NotImplementedError 을 반환합니다.

트랜스파일러 사용 중단 사항

  • qiskit.transpiler.passes.CXCancellation 패스는 더 이상 사용되지 않습니다 InverseCancellation로 대체되었습니다. CXCancellationInverseCancellation([CXGate()]) 와 의미적으로 완전히 동일합니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.ALAPSchedule 는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 패스는 분석 패스인 ALAPScheduleAnalysis로 대체되며, 이는 분석 패스입니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.ASAPSchedule 는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 으로 대체되었습니다 ASAPScheduleAnalysis 와 새로운 스케줄링 워크플로로 대체되었습니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.DynamicalDecoupling 는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 대신 동일한 기능을 수행하는 PadDynamicalDecoupling를 사용하면 동일한 기능을 수행하지만 그 전에 스케줄링 및 정렬 분석 패스를 실행해야 합니다.

  • 트랜스파일레이션 패스 qiskit.transpiler.passes.AlignMeasures 는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 대신 동일한 기능을 수행하는 ConstrainedReschedule를 사용하면 동일한 기능을 수행하며 추가 타이밍 제약 조건에 맞게 정렬할 수 있습니다.

시각화 기능의 사용 중단

  • 타임라인 서랍의 show_idleshow_barrier 매개변수는 회로 서랍 매개변수와 일치하도록 각각 idle_wiresplot_barriers 으로 대체되었습니다. 이전 이름은 이제 더 이상 사용되지 않으며 다음 주요 릴리스에서 제거될 예정입니다. 새로운 매개변수는 완전히 동일합니다.

버그 수정

  • 함수 관련 문제를 수정했습니다 qpy.dump() 함수에서 use_symengine 플래그가 True 로 평가되지만 실제로는 부울 True 이 아닌 진실 객체로 설정된 경우, 생성된 QPY 페이로드가 손상되는 문제를 수정했습니다. 예를 들어 use_symengineHAS_SYMENGINE로 설정하면 이 객체는 부울로 캐스팅할 때 True 로 평가되지만 실제로는 True 이 아닙니다.

  • 함수 관련 문제를 수정했습니다 circuit_drawer() 함수 및 QuantumCircuit.draw() 메서드 관련 문제를 수정했습니다.

  • 트랜스파일러 패스에 ConstrainedReschedule 트랜스파일러 패스가 이전에 회로에 명령어가 포함된 경우 오류가 발생하던 문제를 수정했습니다 Reset 인스트럭션이 포함된 경우 오류가 발생하던 문제를 수정했습니다. 패스가 더 이상 오류가 발생하지 않도록 수정되었지만, 실제 하드웨어는 특히 중간 회로 측정 및 재설정 시 키스킷 스케줄러가 가정하는 것과 다르게 동작할 수 있습니다. 키스킷 스케줄러는 둘 중 하나를 포함하는 회로를 만나면 RuntimeWarning 을 발생시킵니다. 수정 #10354

  • CommutationChecker 클래스에서 게이트의 name 속성이 UTF8 인코딩된 경우 오류가 발생하는 문제를 수정했습니다. 이전에는 ascii 인코딩이 있는 게이트 이름만 작동했습니다. 수정 #12501

  • 의 문제를 수정했습니다 SparsePauliOp.apply_layout()Pauli.apply_layout() 메서드에 중복되거나 음수 인덱스가 있는 잘못된 배열이 layout 인수로 전달되었을 때 발생하는 문제를 수정했습니다. 이전에는 오류가 발생하지 않았고 수행된 변환이 유효하지 않았습니다. 이제 이러한 메서드는 레이아웃의 일부로 중복 인덱스나 음수 인덱스가 제공되면 QiskitError 를 반환합니다. 레이아웃의 일부로 중복 인덱스 또는 음수 인덱스가 제공된 경우.

  • 의 성능 문제를 수정했습니다 BackendSamplerV2BackendEstimatorV2. 수정 #12290

  • 의 문제를 수정했습니다 convert_to_target() 객체에서 제어 흐름 명령이 지정되는 일반적인 위치인 BackendConfiguration.supported_instructions 어트리뷰트에 지정된 경우 변환기가 제어 흐름 명령을 잘못 무시하는 문제를 수정했습니다 BackendConfiguration 객체에서 지정되는 일반적인 위치입니다. 11872 수정.

  • 관련 문제를 수정했습니다 circuit_drawer() 또는 QuantumCircuit.draw()mpl 출력 옵션을 사용할 때 그려지는 회로에 ControlFlow 연산이 있고 fold 옵션이 -1 (접힘 없음)으로 설정되어 있는 경우 프로그램이 중단되는 문제를 수정했습니다. 12012번 수정.

  • 사용자 지정 펄스 지침을 레거시 형식으로 변환하는 버그가 수정되었습니다 qiskit.qobj 형식으로 변환하는 버그를 수정했습니다. 이 버그는 키스킷( 1.0.0 )에 도입되어 사용자 지정 펄스 모양을 가진 명령어를 변환할 때 오류가 발생했습니다. 수정 후 변환이 올바르게 수행되고 사용자 지정 펄스가 원래대로 Waveform 로 변환됩니다. 11828 수정.

  • 의 버그가 수정되었습니다 transpile() 의 버그가 수정되었습니다. 사용자 정의 instruction_durations, dtbackend_properties 제약 조건이 백엔드 유형 BackendV2. 수정 후 동작은 이제 제공된 백엔드가 유형이 BackendV1 유형인지 또는 BackendV2. 마찬가지로, 사용자 정의 timing_constraints 는 이제 target 입력에 의해 재정의되지만 BackendV1BackendV2 입력보다 우선합니다.

  • 호출 EquivalenceLibrary.set_entry() 을 호출하면 이제 라이브러리의 내부 그래프 객체가 올바르게 업데이트됩니다. 이전에는 메타데이터는 업데이트되지만 그래프 구조는 변경되지 않았기 때문에 다음과 같은 사용자는 BasisTranslator 와 같은 사용자는 여전히 이전 규칙을 사용하게 됩니다. 11958 수정.

  • 이제 EvolvedOperatorAnsatz 는 이제 연산자 인수가 빈 목록인 경우를 올바르게 처리합니다. 이전에는 이렇게 하면 오류가 발생했습니다.

  • 이제부터 EvolvedOperatorAnsatz 는 큐비트가 0인 경우 큐비트가 하나도 없는 대신 QuantumRegister 인스턴스를 갖게 됩니다. 이 동작은 슈퍼클래스와 더 일관되게 일치합니다 QuantumCircuit.

  • 메서드 Instruction.repeat() 는 이제 세트 condition 를 바깥쪽 반환된 Instruction 로 이동하고 정의의 내부 게이트는 무조건 남겨둡니다. 이전에는 메서드가 내부 정의 내에 ClassicalRegister 인스턴스를 내부 정의 내에 남겨두었는데, 이는 유효하지 않은 상태였으며 나중에 트랜슬레이션이나 내보내기 중과 같이 겉보기에는 관련이 없는 버그로 나타났습니다. 고정 #11935.

  • 트랜스파일러 패스의 문제를 수정했습니다 InverseCancellation 트랜스파일러 패스에서 경우에 따라 파라미터 값이 일치하지 않더라도 자체 역 파라미터화된 게이트가 잘못 취소되는 문제를 수정했습니다. 수정 #11815

  • 게이트의 분해 개선 MCXGateMCPhaseGate 의 분해를 개선하여 안실라 큐비트를 사용하지 않고도 CXGate 가 기하급수적으로 증가하지 않고 큐비트 수가 기하급수적으로 증가하도록 개선합니다.

  • 함수 충돌 버그가 수정되었습니다 convert_to_target() 함수를 충돌시키는 버그가 수정되었습니다( T1, T2 또는 주파수 중 하나). 에서 누락된 속성 값은 QubitProperties 로 채워집니다 None.

  • BasePassManager.run() 은 더 이상 이전 워크플로우를 PropertySet 을 두 번 이상 호출할 때 새 워크플로로 누출되지 않습니다. 이전에는 이전과 동일한 PropertySet 을 사용하여 후속 실행을 초기화했는데, 이는 잘못된 속성 정보가 작업에 제공되고 있음을 의미할 수 있습니다. 이제 동작은 Qiskit 0.44 의 동작과 일치합니다. 수정 #11784.

  • Pauli.evolve() 이제 ECR 게이트가 포함된 양자 회로를 올바르게 처리합니다. 이전에는 클리포드 게이트로 인식되지 않아 오류가 발생했습니다.

  • 버그를 수정했습니다 Pauli.evolve() 특정 클리포드 게이트('cx', 'cz' 등)와 이름이 일치하는 회로로 진화하면 회로의 내용이 아닌 회로 이름에 따라 폴리가 진화하는 버그가 수정되었습니다. 이 버그는 기본 옵션이 아닌 frame='s' 에서만 발생했습니다.

  • 회로에서 많은 수의 큐비트와 비트를 역직렬화할 때 qpy.load() 함수의 성능 문제를 수정했습니다. 회로에 많은 수의 큐비트 또는 클릿이 있는 QPY 페이로드를 역직렬화할 때.

  • default_alignment 인수의 처리 버그를 수정했습니다 build(). 유형의 입력 AlignmentKind 유형의 입력은 이제 기본 정렬로 올바르게 처리됩니다.

  • qiskit.pulse.utils.format_parameter_value() 함수에서 큰 정수를 실수로 부동 소수점 값으로 변환하거나 예기치 않은 반올림을 일으키는 버그가 수정되었습니다. 자세한 내용은 #11971을 참조하세요.

  • 클래스의 문제를 수정합니다 QDrift 클래스에서 해밀턴 계수가 각 계수의 절대값을 취하여 강제로 양수가 되게 했던 문제를 수정했습니다. 음수 계수의 부호가 다시 추가되도록 수정되었습니다.

  • convert_durations_to_dt() 에서 속성의 원래 단위와 관계없이 회로 지속 시간에 대해 초에서 dt 로의 변환을 맹목적으로 적용하는 버그가 수정되었습니다. 이로 인해 보고된 회로 지속 시간이 잘못 계산될 수 있습니다.

  • 수정 SparsePauliOp.apply_layout() 가 제로 큐비트 연산자와 올바르게 작동하도록 수정되었습니다. 예를 들어 이전에 0 큐비트를 생성하고 다음과 같은 레이아웃을 적용한 경우입니다:

    op = SparsePauliOp("")
    op.apply_layout(None, 3)

    이전에는 오류가 발생했을 것입니다. 이제 형식의 연산자가 올바르게 반환됩니다: SparsePauliOp(['III'], coeffs=[1.+0.j])

  • 트랜스파일러 패스의 Commuting2qGateRouter 트랜스파일러 패스에서 qreg 순열이 패스 속성 세트에 추가되지 않아 사용자가 수동으로 추적해야 하는 문제를 수정했습니다. 이제 출력 회로의 layout 속성을 통해 순열에 액세스하고 정보 손실 없이 모든 트랜스필레이션 파이프라인에 패스를 연결할 수 있습니다.

  • 특정 펄스 단위를 초와 나노초 사이로 스케일링할 때 부동 소수점 부정확성을 수정했습니다. 펄스가 기호적으로 정의된 경우, symengine 의 특정 빌드에 대한 스케일링으로 인해 불필요한 부동 소수점 오류가 발생할 수 있으며, 심볼이 완전히 바인딩되면 예기치 않은 결과가 나타날 수 있습니다. 수정 #12392.

  • 의 사전 설정 패스 관리자 transpile() 의 사전 설정 패스 관리자는 하드웨어 타겟 또는 기본 게이트 세트가 지정되지 않은 경우 제어 흐름이 있는 회로에서 더 이상 실패하지 않습니다. 이제 이러한 추상적인 대상을 모든 제어 흐름 작업을 허용하는 것으로 취급합니다. 11906 수정.

  • qiskit.instruction.Instruction.soft_compare() 메서드는 두 게이트의 이름, 큐비트 수, 클릿 수, 매개변수 수가 일치하는지 비교하기 위한 것입니다. 그러나 일치하는 큐비트 수와 클릿 수를 확인하지 않는 오타가 있었습니다. 이렇게 하면 명백한 오타가 해결됩니다.

  • 기본 init 플러그인은 잘못된 최적화 수준으로 호출될 때 TranspilerError 를 제대로 발생시키지 않았습니다.

  • 생성자 메서드 관련 문제를 수정했습니다 Operator.from_circuit() 생성자 메서드에서 최종 레이아웃 순열을 잘못 해석하여 유효하지 않은 배열이 Operator 가 생성되던 문제를 고쳤습니다. 이전에는 초기 레이아웃에 관계없이 최종 레이아웃이 처리되었기 때문에, 초기 레이아웃이 중요하지 않은 모든 양자 회로에 대해 초기화가 잘못되었습니다.

  • 여러 회로를 병렬로 실행할 때 PassManager.run() 에서 여러 회로를 병렬로 실행할 때 발생하는 성능 문제를 수정했습니다. 더 이상 여러 입력을 직렬로만 처리할 경우 병렬 실행의 요구 사항인 PassManager (병렬 실행을 위한 요구 사항)를 직렬화하는 데 더 이상 시간을 소비하지 않습니다(여러 입력이 주어졌을 때 입력을 직렬로만 처리할 경우).

  • Parameter 는 동일하게 비교되는 인스턴스가 항상 동일한 해시를 갖도록 업데이트되었습니다. 이전에는 Parameter.uuid 만 비교되었기 때문에 Parameteruuid 매개변수의 공통 값(일반적으로 명시적으로 전달되지 않음)을 사용하여 구성한 경우 이름이 다른 인스턴스도 동일하게 비교될 수 있었습니다.

  • plot_coupling_map() 에서 커플링 맵의 가장자리 색상이 잘못 지정되던 버그를 수정했습니다. 수정 #12369.

  • OpenQASM 2.0 파서(qasm2.load()qasm2.loads())는 이제 시스템 크기 정수를 오버플로하는 정수 피연산자를 포함한 게이트-각 식을 평가할 수 있습니다. 나머지 표현식은 항상 그랬던 것처럼 배정밀도 부동소수점 컨텍스트에서 평가됩니다. 그러나 임의로 큰 정수는 반드시 배정밀도 부동 소수점으로 정확히 표현할 수 있는 것은 아니므로 회로가 어떻게 생성되었든 이미 모든 수치 정밀도 모듈로 2π2\pi 를 잃었을 가능성이 있습니다.

  • ParameterOpenQASM 3 프로그램에서 input 변수의 스탠드인으로 사용되는 인스턴스는 이제 OpenQASM 3으로 내보내는 동안 내장 게이트와의 충돌을 피하기 위해 이름이 이스케이프됩니다. 이전에는 명명 충돌이 발생하여 내보내기가 잘못된 OpenQASM 3을 생성할 수 있었습니다.

  • 버그 수정 QuantumCircuit.draw() 의 버그가 수정되어 Matplotlib 서랍의 사용자 정의 스타일 사전이 실행 시 수정되었습니다.

  • QuantumCircuit.append()copy=True (기본값)과 함께 사용하면 이제 매개변수화된 명령어가 올바르게 복사됩니다 ParameterExpression 인스턴스뿐만 아니라 Parameter 인스턴스가 아닌

  • 사용자 지정 회로 보정의 내부 처리 및 InstructionDurations 함수에서 개별 트랜스파일러 패스로 오프로드되었습니다 transpile() 함수에서 개별 트랜스파일러 패스로 오프로드되었습니다: DynamicalDecoupling, DynamicalDecoupling. 이전에는 명령_durations 입력 인수에 수동으로 통합하지 않으면 회로 보정의 명령 지속 시간이 고려되지 않았지만, 이제 필요한 패스는 회로를 분석하여 타깃 > 사용자 정의 입력 > 회로 보정의 우선 순위에 따라 가장 관련성이 높은 지속 시간 값을 선택하게 됩니다.

  • 버그 수정 transpile() 에서 dt 또는 instruction_durations 인수가 제공된 경우에만 num_processes 인수가 사용되던 버그를 수정했습니다.

기타 참고사항


1.0.0rc1

공급자 업그레이드 안내

  • 더 이상 사용되지 않는 qiskit.providers.fake_provider 모듈이 qiskit-ibm-runtime Python 패키지로 마이그레이션되었습니다. 이러한 이유로, 키스킷의 다음 요소들은 qiskit.providers.fake_provider 의 다음 요소는 키스킷에서 더 이상 사용되지 않음에 따라 제거되었습니다 0.46:

    • qiskit.providers.fake_provider.FakeProvider
    • qiskit.providers.fake_provider.FakeProviderForBackendV2
    • qiskit.providers.fake_provider.FakeProviderFactory
    • qiskit.providers.fake_provider.fake_backends.FakeBackendV2
    • qiskit.providers.fake_provider.backends 에 포함된 모든 가짜 백엔드(공급자를 통해 액세스 가능)
    • qiskit.providers.fake_provider.FakeQasmSimulator
    • qiskit.providers.fake_provider.FakeJob
    • qiskit.providers.fake_provider.FakeQobj

    새 가짜 공급자 모듈을 사용하려면 pip install qiskit-ibm-runtime 을 실행하고 qiskit 가져오기 경로(qiskit.providers.fake_provider)를 새 가져오기 경로(qiskit_ibm_runtime.fake_provider)로 바꾸면 됩니다. 마이그레이션 예시:

    # Legacy path
    from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()
    
    # New path
    # run "pip install qiskit-ibm-runtime"
    from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()

    또한, 특수 테스트 목적으로 설계된 다음과 같은 가짜 백엔드가 새로운 GenericBackendV2 클래스로 대체되었으며, 키스킷에서 더 이상 사용되지 않음에 따라 제거되었다 0.46:

    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
    • `qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple

    새 클래스로의 마이그레이션 예제 GenericBackendV2 클래스로의 마이그레이션 예제:

    # Legacy path
    from qiskit.providers.fake_provider import FakeBackend5QV2
    backend = FakeBackend5QV2()
    
    # New path
    from qiskit.providers.fake_provider import GenericBackendV2
    backend = GenericBackendV2(num_qubits=5)
    # note that this class will generate 5q backend with generic
    # properties that serves the same purpose as FakeBackend5QV2
    # but will generate different results
이 페이지가 도움이 되었습니까?
GitHub에서 버그, 오타를 보고하거나 컨텐츠를 요청하십시오.