Skip to main content
IBM Quantum Platform

키스킷 SDK 2.0 릴리즈 노트


2.0.3

Prelude

키스킷 v2.0.3 은 v2.0 마이너 버전 시리즈의 버그 수정 릴리스입니다.

버그 수정

  • ApplyLayout 은 이제 제로 큐비트를 적용하는 경우를 올바르게 처리합니다 Layout. 이전에는 "layout" 필드가 같더라도 레이아웃이 설정되지 않았다고 주장했습니다 PropertySetLayout() 와 같더라도 레이아웃이 설정되지 않았다고 주장했습니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 ElidePermutations 트랜스파일러 패스에서 출력 순열이 올바르게 업데이트되지 않던 문제를 수정했습니다 PermutationGate 연산이 있을 때 출력 순열이 올바르게 업데이트되지 않던 문제를 수정했습니다. 이렇게 하면 출력 회로가 잘못되고 property_setvirtual_permutation_layout 속성이 잘못 설정됩니다. 대규모의 일부로 실행할 경우 PassManager 의 일부로 실행하면 잘못된 TranspileLayout 가 출력 회로에서 QuantumCircuit.layout 출력 회로에 반환됩니다.

  • 패스의 버그를 수정했습니다 HighLevelSynthesis 중첩/커스텀 객체를 언롤링할 때 Instruction 객체를 펼칠 때의 버그를 수정했습니다. 만약 QuantumCircuit 에 의해 반환된 Instruction.definition 에 의해 반환된 객체에 Clbit 객체를 포함하는 경우, 이러한 클래식 비트는 내부 인덱스 내부의 Instruction.definition QuantumCircuit 의 내부 인덱스를 외부의 해당 인덱스에 매핑하는 대신 QuantumCircuit.

  • 의 버그를 수정했습니다 PauliEvolutionSynthesisDefaultPauliEvolutionSynthesisRustiq 플러그인의 버그가 수정되었습니다. preserve_order=False. 플러그인의 동작이 복원되었으며 이제 트랜스필레이션 파이프라인 전체에서 원래 회로가 보존됩니다.

  • 지원되는 최소 rustworkx 버전( 0.15 )과의 호환성 문제를 수정했습니다. 특정 입력값을 사용하면 VF2LayoutVF2PostLayout 는 이전에 rustworkx 0.16.0 에 추가된 rustworkx 메서드를 사용했기 때문에 지원되는 것으로 나열된 이전 rustworkx 릴리스를 사용할 때 오류가 발생할 수 있습니다.

  • SabreLayoutSabreSwap 를 사용하는 회로에 라우팅 결과를 적용할 때 더 이상 당황하지 않습니다 expr.Var 또는 Stretch 객체를 사용하는 회로에 라우팅 결과를 적용할 때 더 이상 당황하지 않습니다.

  • qiskit.circuit.library.quantum_volume() 를 처리하도록 업데이트되었습니다 numpy.random.Generatorseed 인수의 입력으로 처리하도록 업데이트되었습니다. 이전에는 이러한 생성기 인수가 TypeError.


2.0.2

Prelude

키스킷 v2.0.2 은 v2.0 마이너 버전 시리즈의 버그 수정 릴리스입니다.

버그 수정

  • 수정 name 속성을 수정하여 OrGate 클래스의 속성이 이제 "or" 로 설정되어 이 게이트를 고유하게 식별하도록 수정했습니다. 이전에는 "and" 로 잘못 설정되어 다음과 구분할 수 없었습니다 AndGate 와 구별할 수 없거나 합성 플러그인을 사용하여 OrGate.

  • 트랜스파일러 패스의 문제를 수정했습니다 ConsolidateBlocks 트랜스파일러 패스에서 (직접 또는 타깃을 통해) 선택된 KAK 게이트가 슈퍼컨트롤이 아닌 경우 일부 블록 통합에 실패하는 문제를 수정했습니다 CXGate. 수정 #14413

  • 회로 기능의 버그 수정 evolved_operator_ansatz(), qaoa_ansatz()hamiltonian_variational_ansatz()에서 매개변수에 0 복소수 구성 요소가 있는 버그가 수정되었습니다. 이는 일반적으로 매개 변수를 SymPy 으로 변환하지 않는 한 문제가 되지 않았습니다 ParameterExpression.sympify() 메서드를 사용하면 오류가 발생했습니다.


2.0.1

Prelude

키스킷 v2.0.1 은 v2.0.x 릴리즈 시리즈의 마이너 버그 수정 릴리즈입니다.

버그 수정

  • 텍스트 회로 서랍의 시각화 버그에서 번역 후 제어 흐름 연산의 닫는 '대괄호'가 세로로 정렬되지 않고 렌더링될 수 있던 문제를 수정했습니다. 자세한 내용은 #14271을 참조하세요.

  • 트랜스파일러 패스의 버그를 수정했습니다 UnitarySynthesis 트랜스파일러 패스의 버그가 synth_gates 매개변수를 무시하고 unitary 게이트만 합성하는 문제를 수정했습니다. 이제 패스는 synth_gates 파라미터에 지정된 모든 게이트를 올바르게 합성합니다. 수정 #14343.

  • 에 대한 누락된 repr 지원 추가 Duration.

  • Python 피클에 대한 누락된 지원 추가 Duration. 이로 인해 지속 시간 표현식을 사용하는 delay() 기간 표현식을 사용하는 명령어와 병렬 변환을 방지했습니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 HighLevelSynthesis 트랜스파일러 패스에서 제어 흐름 연산을 사용하는 특정 회로에서 조기에 잘못 종료되는 문제를 수정했습니다. 수정 #14338

  • 에서 순간 양자 다항식 시간(IQP) 회로 구성이 수정되었습니다 IQPiqp(). 이전 구현에서는 TT 게이트의 권한 대신 T\sqrt{T} 게이트의 권한을 잘못 사용했습니다.

  • SabreLayout 는 이제 회로의 namemetadata 필드를 조인트 레이아웃 및 라우팅 패스로 수행할 때 올바르게 전파합니다.

  • 단일 합성 플러그인의 문제를 수정했습니다 SolovayKitaevSynthesis 단일 합성 플러그인에서 다른 베이시스 게이트로 플러그인을 반복적으로 실행하면 첫 번째 실행의 베이시스 게이트만 잘못 재사용되는 문제를 수정했습니다. 이 문제는 기본 근사치를 캐싱할 때 기준 게이트를 무시했기 때문에 발생했습니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 SolovayKitaev 트랜스파일러 패스에서 내부 재귀에서 180도 회전이 발생하여 패스가 제대로 처리되지 않아 충돌이 발생할 수 있는 문제를 수정했습니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 SolovayKitaev 트랜스파일러 패스에서 생성된 근사값이 올바른 값과 π\pi 차이 나는 위상을 가질 수 있는 문제를 수정했습니다. 이는 큐비트 게이트 행렬의 올바른 부호를 얻기 위해 추가 처리가 필요한 내부 SO(3)SO(3) 표현으로 인해 발생한 결과입니다. 수정 #9552

  • 스트레치가 있는 지연이 포함된 회로( QuantumCircuit.add_stretch())는 이제 사전 설정된 패스 관리자(transpile()generate_preset_pass_manager())를 사용하여 정렬 제약 조건이 있는 백엔드(예: IBM 퀀텀 이글 디바이스( ibm_sherbrooke))를 타깃팅할 수 있습니다.

  • 의 폴백 오류 휴리스틱은 VF2LayoutVF2PostLayout의 오류 휴리스틱은 보고된 오류율이 없을 때 사용되며, 이전에는 1보다 큰 오류를 할당하고 결과 레이아웃 점수에 예측할 수 없는 영향을 미칠 수 있었습니다.


2.0.0

Prelude

키스킷의 성능과 기능을 개선하는 새로운 기능이 포함된 키스킷( v2.0.0 )을 출시하게 되어 기쁩니다. 키스킷( v2.0.0 )의 주요 기능은 다음과 같습니다:

  • 객체를 빌드하고 상호 작용하기 위한 C API 도입 SparseObservable 객체와 상호 작용하기 위한 C API 도입 이 첫 번째 컴파일된 언어 인터페이스는 키스킷의 진화에서 중요한 이정표이며, v2.x 릴리스 시리즈에 걸쳐 그 범위가 확장될 것입니다. C API의 초기 반복은 실험적인 기능이며, 버전 전략에 따라 마이너 버전에서는 API가 변경될 수 있습니다.
  • 새로운 BoxOp 제어 흐름 연산이 추가되어 OpenQASM 3 상자의 개념에 매핑되고 나중에 처리 및 사용자 지정 예약을 위해 일련의 명령어를 그룹화할 수 있습니다. 이 연산자는 회전, 노이즈 학습, 스트레치 기반 스케줄링과 같은 애플리케이션에 유용합니다.
  • 인스트럭션에 대해 stretch 기간을 생성하는 기능 Delay 명령어를 생성하여 타이밍을 인식하는 명령어 간의 관계를 표현할 수 있습니다. 새로운 Stretch 유형은 기존의 기존 표현식 시스템을 확장하여 회로 구성 시 설계 의도를 파악하고 컴파일 시점에 해결할 수 있습니다. 자세한 내용은 OpenQASM 문서를 참조하세요.
  • 합성이 개선되었습니다 Target 에 다음과 같은 임의의 각도를 지원하는 분수 2 큐비트 베이시스 게이트가 포함되어 있을 때 합성이 개선되었습니다 RZXGate 또는 RZZGate와 같은 임의 각도를 지원하여 합성된 회로의 게이트 수를 크게 줄였습니다.
  • 특히 회로 구성 단계에서 런타임 성능이 향상되었으며, 벤치마크 결과 Qiskit v1.3 에 비해 2x 속도가 향상되었습니다. 이러한 개선은 다음과 같은 추가적인 네이티브 Rust 게이트 표현을 활용하고, 기존 데이터 모델 요소를 제거하는 등 여러 가지 기여를 통해 이루어졌습니다 UnitaryGate와 같은 추가적인 네이티브 Rust 게이트 표현을 활용하고 레거시 데이터 모델 요소를 제거하는 등의 기여를 통해 이루어졌습니다.

v1.0.0 릴리스 당시 문서화된 시맨틱 버전 관리 정책에 따라 이번 주요 릴리스에는 v1.x 릴리스 시리즈와 하위 호환되지 않는 API 변경 사항도 포함되어 있습니다. 특히, .c_if() 메서드, qobj 모듈, BackendV1, qiskit.pulse, 그리고 더 이상 사용되지 않는 V1 프리미티브 참조 구현과 같이 더 이상 사용되지 않는 키스킷 데이터 모델의 여러 구성 요소가 제거되었습니다. 이러한 모든 제거 및 API 변경 사항에 대한 자세한 내용은 업그레이드 릴리스 노트 섹션을 참조하세요. 제거된 API는 앞으로 6개월 동안 버그 수정이 제공되고 1년간 보안 업데이트가 제공되는 Qiskit v1.4.x 릴리스에서 계속 지원됩니다.

새 기능

  • Linux aarch64 플랫폼에 대한 지원은 문서에 설명된 대로 티어 1 지원으로 승격되었습니다:

    /가이드/설치-키스킷#운영체제-지원

    의 이전 지원 수준인 티어 2( v1.x ) 릴리스 시리즈에서 변경되었습니다.

  • 희소 관측값을 구축하고 상호 작용할 수 있는 새로운 C API를 도입했습니다. 이번 릴리스의 API 표면은 상당히 작지만 - 단지 SparseObservable 클래스만 포함하지만, SDK가 처음으로 C로 공용 인터페이스를 노출하고 향후 키스킷 C 인터페이스의 확장을 위한 기반을 마련한다는 점에서 키스킷의 발전에 있어 중요한 이정표가 될 것입니다. 이것은 C의 첫 번째 공개 인터페이스이므로 실험적인 기능이며, 필요한 경우 마이너 버전 릴리스에서 API가 변경될 수 있습니다.

    자세한 구문과 추가 정보는 C API 문서에서 확인할 수 있습니다. 100-큐비트 관측 가능 2 X0 Y1 Z2 을 구축하는 최소한의 예시입니다:

    #include <complex.h>
    #include <qiskit.h>
    #include <stdint.h>
    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
        // build a 100-qubit empty observable
        uint32_t num_qubits = 100;
        QkObs *obs = qk_obs_zero(num_qubits);
    
        // add the term 2 * (X0 Y1 Z2) to the observable
        complex double coeff = 2;
        QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        uint32_t indices[3] = {0, 1, 2};
        QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
        qk_obs_add_term(obs, &term);
    
        // print some properties
        printf("num_qubits: %u\n", qk_obs_num_qubits(obs));
        printf("num_terms: %lu\n", qk_obs_num_terms(obs));
    
        // free the memory allocated for the observable
        qk_obs_free(obs);
    
        return 0;
    }

회로 기능

  • 새로운 get_control_flow_name_mapping() 편의 함수를 추가하여 키스킷 제어 흐름 연산 이름을 해당 클래스에 매핑하여 반환합니다.

    사용 예:

    from qiskit.circuit import get_control_flow_name_mapping
    
    ctrl_flow_name_map = get_control_flow_name_mapping()
    if_else_object = ctrl_flow_name_map["if_else"]
    
    print(if_else_object)
    <class 'qiskit.circuit.controlflow.if_else.IfElseOp'>
  • 새로운 회로 메서드가 추가되었습니다, QuantumCircuit.estimate_duration()를 추가하여 트랜스필레이션 후 예약된 회로의 지속 시간을 추정할 수 있습니다. 회로 지속 시간은 주어진 경로에서 제공된 지속 시간을 기반으로 예약된 회로에서 가장 긴 경로를 찾아서 추정합니다 Target. 이 방법은 제어 흐름이나 기타 고전적인 피드 포워드 연산을 포함하지 않는 간단한 회로에서만 작동합니다.

    더 이상 사용되지 않는 QuantumCircuit.duration 속성 대신 이 방법을 사용하세요.

    사용 예:

    from qiskit import QuantumCircuit, transpile
    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(num_qubits=3, seed=42)
    
    circ = QuantumCircuit(3)
    circ.cx(0, 1)
    circ.measure_all()
    circ.delay(1e15, 2)
    
    circuit_dt = transpile(circ, backend, scheduling_method="asap")
    duration = circuit_dt.estimate_duration(backend.target, unit="s")
    print("Estimated duration: ", duration)
  • 두 개의 새로운 클래스를 추가했습니다: BitFlipOracleGatePhaseOracleGate. BitFlipOracleGate 를 직접 합성하는 대신 BooleanExpression 을 대체하기 위해 도입되었으나, 키스킷 v2.0 에서 제거되었습니다. PhaseOracleGate 의 대안으로 PhaseOracle의 대안으로 추가되었으며, 후자는 v2.x 릴리스에서 더 이상 사용되지 않습니다. 두 클래스 모두 인터페이스를 공유합니다 PhaseOracle의 인터페이스를 공유하지만 evaluate_bitstring 메서드는 더 이상 존재하지 않습니다.

    BitFlipOracleGate 는 위상 플립 오라클 대신 비트 플립 오라클을 합성하므로 하나의 추가 큐비트에서 작동하며, 오라클이 인코딩한 표현식의 값에 따라 제어가 결정되는 제어-X 연산을 적용하는 것으로 볼 수 있습니다.

    from qiskit import QuantumCircuit
    from qiskit.circuit.library.bit_flip_oracle import BitFlipOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = BitFlipOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-1_00.png _images/release_notes-1_01.png
    from qiskit import QuantumCircuit
    from qiskit.circuit.library.phase_oracle import PhaseOracleGate
    qc = QuantumCircuit(5)
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracleGate(bool_expr)
    qc.compose(oracle, inplace=True)
    qc.draw('mpl')
    qc.decompose().draw('mpl')
    _images/release_notes-2_00.png _images/release_notes-2_01.png
  • 새로운 제어 흐름 연산 BoxOp와 관련된 QuantumCircuit.box() 메서드와 컨텍스트 관리자를 이제 qiskit.circuit.

    상자를 구성하는 일반적인 방법은 QuantumCircuit.box() 컨텍스트 관리자를 사용하는 것입니다:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(5)
    
    with qc.box():
      # This box "uses" qubits 0 and 1.
      qc.x(0)
      qc.z(1)
    
    # Boxes can be assigned a duration.
    with qc.box(duration=100, unit="ms"):
      # This box "uses" qubits 2, 3 and 4.
      # Qubit 4 undergoes no operations.
      qc.cx(2, 3)
      qc.noop(4)

    키스킷 '박스'는 OpenQASM 3의 박스 개념과 거의 직접적으로 매핑됩니다.

    박스에서 "사용된" 모든 큐비트는 박스의 시작과 끝에서 타이밍이 동기화됩니다. 즉, 상자는 사용하는 모든 큐비트에 대해 동일한 '지속 시간'을 가지며 시작 지점이 동기화됩니다. 와 같은 범위의 다른 연산은 BoxOp 자체는 상자를 원자적인 것으로 간주합니다. 연산이 전체 상자의 동작과 통근하는 경우 연산이 전체 상자를 지나가는 것은 유효하지만 일반적으로 연산이 상자 안팎으로 이동하는 것은 유효하지 않습니다.

    박스의 주요 용도는 나중에 처리할 일련의 명령어를 그룹화하고(예: 2큐비트 게이트의 일부 레이어를 그룹화), 블록 내에서 상대 스케줄링을 사용하면서 복합 블록을 하나의 범위에서 함께 스케줄링하는 것입니다(예: 그룹에서 여러 큐비트를 동적으로 디커플링하는 것). 키스킷의 컴파일러에는 아직 명령어를 그룹화하거나 명령어를 예약하는 내장 패스가 없습니다 BoxOp.

    트랜스파일러는 박스가 있는 경우 라우팅 및 레이아웃을 지원하며, 박스 내에서 최적화( optimization_level 설정까지)를 수행하지만 아직 박스의 원자 구조에 대한 최적화는 수행하지 않습니다. 텍스트 및 Matplotlib 기반 회로 서랍 지원 상자입니다. QPY와 OpenQASM 3으로 내보내기는 지원되지만, OpenQASM 3에는 현재 박스 내에서 유휴 큐비트를 지정하는 방법이 없습니다(조만간 사양 변경을 통해 이 기능이 추가될 예정입니다: 관련 기능 제안서 참조).

  • 에 새로운 approximation_degree 인수를 추가했습니다 CommutationChecker.commute()CommutationChecker.commute_nodes(). 이 인수를 사용하면 게이트가 출퇴근으로 평가되는 시점에 대한 근사 임계값을 설정할 수 있습니다. 의 문서를 참조하세요 CommutationChecker 의 문서 문자열을 참조하세요.

  • 새로운 회로 메서드가 추가되었습니다, QuantumCircuit.noop()를 추가하여 큐비트에 해당 연산을 추가하지 않고도 제어 흐름 빌더 범위 내에서 사용된 것으로 명시적으로 표시할 수 있습니다.

  • 기존의 실시간 표현식 모듈인 qiskit.circuit.classical 은 이제 상수 표현식을 표현할 수 있습니다. 클래스에는 Expr 클래스에는 이제 표현식의 상수성을 나타내는 부울 const 속성이 있습니다. 이를 통해 특정 컨텍스트의 표현식은 컴파일 시점에 평가할 수 있어야 한다는 것을 강제할 수 있습니다.

    모든 Var 표현식은 비-const로 간주되고, 모든 Value 표현식은 const로 간주됩니다.

    다른 const 표현식으로만 구성된 표현식도 const입니다:

    from qiskit.circuit.classical import expr
    
    assert expr.bit_and(5, 6).const

    컨스트가 아닌 표현식을 포함하는 표현식은 컨스트가 아닙니다:

    from qiskit.circuit.classical import expr, types
    
    assert not expr.bit_and(5, expr.Var.new("a", types.Uint(5)).const
  • 기존의 실시간 표현식 모듈인 qiskit.circuit.classical 은 이제 새로운 유형인 Duration.

    모듈 qiskit.circuit 에는 새로운 Duration 클래스가 있어 기존 표현식 내에서 리터럴 값으로 사용할 수 있습니다.

    함수는 lift() 함수를 사용하여 다음에서 값 표현식을 만들 수 있습니다 Duration 인스턴스에서 값 표현식을 만드는 데 사용할 수 있습니다:

    from qiskit.circuit import Duration
    from qiskit.circuit.classical import expr
    
    expr.lift(Duration.dt(1000))
    # Value(Duration.dt(1000), Duration())
  • 기존의 실시간 표현식 모듈인 qiskit.circuit.classical 은 이제 새로운 타입을 사용하여 IEEE-754 배정밀도 부동 소수점 값을 표현할 수 있습니다 Float.

    함수는 lift() 함수를 사용하여 Python float에서 값 표현식을 만들 수 있습니다:

    from qiskit.circuit.classical import expr
    
    expr.lift(5.0)
    # >>> Value(5.0, Float())

    이 유형은 주로 타이밍 관련(durationstretch) 표현식에 사용하기 위한 것입니다. 비트 연산이나 논리 연산과는 호환되지 않지만, 먼저 명시적으로 다른 곳에 캐스팅하면 함께 사용할 수 있습니다.

  • 다중 제어 단일 큐비트 단일 게이트를 분해할 때 2큐비트 게이트의 수를 줄였습니다. 예를 들어,

    • 다중 제어의 경우 YGate 의 경우, 10 큐비트에서 CXGate 수가 56% 감소했습니다.
    • 다중 제어의 경우 HGate 의 경우, 10 큐비트에서 CXGate 수가 56% 감소했습니다.
    • 다중 제어의 경우 SXGateSXdgGate 10 큐비트에서 CXGate 수가 80% 감소했습니다.
    • 다중 제어의 경우 UGate 의 경우, 10 큐비트에서 CXGate 수가 31% 감소했습니다.
  • 기존의 실시간 표현식 모듈인 qiskit.circuit.classical 은 이제 산술 연산을 표현할 수 있습니다 add(), sub(), mul()div() 를 숫자 및 타이밍 피연산자로 표현할 수 있습니다.

    예를 들어,

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, Duration
    from qiskit.circuit.classical import expr
    
    # Subtract two integers
    cr = ClassicalRegister(4, "cr")
    qc = QuantumCircuit(cr)
    with qc.if_test(expr.equal(expr.sub(cr, 2), 3)):
        pass
    
    # Multiply a Duration by a Float
    with qc.if_test(expr.less(expr.mul(Duration.dt(200), 2.0), Duration.ns(500))):
        pass
    
    # Divide a Duration by a Duration to get a Float
    with qc.if_test(expr.greater(expr.div(Duration.dt(200), Duration.dt(400)), 0.5)):
        pass

    추가 예제는 위에 링크된 모듈 수준 문서를 참조하세요.

  • 의 생성자에는 UCGate 의 생성자에는 이제 새로운 선택적 인수인 mux_simp 이 추가되어 Carvalho 등의 단순화 검색을 가능하게 하는 부울 값을 받습니다. 이 최적화는 기본적으로 활성화되어 있으며 멀티플렉서에서 불필요한 컨트롤을 식별하고 제거하여 특히 분리 가능한 상태 준비에서 CX 게이트 수와 회로 깊이를 줄입니다 Initialize.

  • 이제 PauliEvolutionGate 는 이제 기본적으로 SparseObservable를 입력으로 지원합니다. 이를 통해 위상 회전 제어로 구현되는 프로젝터에서 진화를 효율적으로 처리할 수 있으며, 폴리스 측면에서 프로젝터를 명시적으로 확장하는 것보다 더 적은 게이트가 필요합니다. 예를 들어,

    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("001")
    evo_proj = PauliEvolutionGate(obs, time=1)
    print(evo_proj.definition.draw())
  • 새로운 표현식 노드 Stretch 가 기존 표현식 시스템에 추가되어 stretch 변수를 표현할 수 있게 되었습니다. 새 stretch 변수를 만들려면 다음을 사용할 수 있습니다 QuantumCircuit.add_stretch(). 결과 표현식은 상수 표현식 유형 Durationduration 인수로 사용할 수 있는 상수 표현식입니다 delay().

    예를 들어, 두 장벽 사이의 일련의 게이트가 실제 길이와 상관없이 왼쪽으로 정렬되도록 하려면 다음과 같이 하면 됩니다:

    from qiskit import QuantumCircuit
    from numpy import pi
    
    qc = QuantumCircuit(5)
    qc.barrier()
    qc.cx(0, 1)
    qc.u(pi/4, 0, pi/2, 2)
    qc.cx(3, 4)
    
    a = qc.add_stretch("a")
    b = qc.add_stretch("b")
    c = qc.add_stretch("c")
    
    # Use the stretches as Delay duration.
    qc.delay(a, [0, 1])
    qc.delay(b, 2)
    qc.delay(c, [3, 4])
    qc.barrier()

    표현식은 Stretch 표현식은 회로에서 기존 변수를 표현하는 데 사용되는 Var 표현식과 가장 유사하지만, 상수이고 항상 타입이 Duration. 다른 표현식에 사용할 수 있으며(예: 숫자 상수를 곱할 수 있음), 그리고 QuantumCircuit 는 이를 위한 전체 범위 지원을 제공합니다(예: 제어 흐름 범위 내에서 캡처하거나 선언할 수 있음).

    추가 컨텍스트와 예제는 OpenQASM 3 언어 사양을 참조하세요

  • 추가된 Gate 버전의 단일 레지스터 연산 게이트가 추가되어 트랜스파일러가 해당 버전에 비해 높은 수준의 최적화를 수행할 수 있습니다 QuantumCircuit 변형 버전이 추가되었습니다. 다음과 같습니다.

기본형 기능

  • 새로운 to_bool_array() 메서드를 추가했습니다 BitArray 클래스에 비트 배열을 부울 NumPy 배열로 반환하는 새로운 메서드를 추가했습니다. order 인수는 출력 배열의 엔디안을 지정하는 데 사용할 수 있습니다.

제공자 기능

  • 클래스 이니셜라이저에 dt 속성을 설정하는 기능이 추가되었습니다 GenericBackendV2 의 속성을 새로운 dt 인수를 사용하여 클래스 이니셜라이저에 설정할 수 있는 기능이 추가되었습니다. 사용 예:

    from qiskit.providers.fake_provider import GenericBackendV2
    
    backend = GenericBackendV2(
      num_qubits = 5,
      basis_gates = ["cx", "id", "rz", "sx", "x"],
      dt = 2.22*e-10,
      seed = 42
    )

양자 정보 특성

  • 새로운 SparseObservable.to_sparse_list() 메서드를 추가하여 희소 목록 표현인 SparseObservable. 예를 들어,

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable.from_list([("+II", 1), ("-II", 1)])
    print(obs.to_sparse_list())  # [("+", [2], 1), ("-", [2], 1)]
  • 새로운 SparseObservable.as_paulis() 메서드를 추가하여 모든 프로젝터를 확장하여 폴리스의 관점에서만 희소 관측가능성을 표현할 수 있습니다. 예를 들어,

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable("+-")
    obs_paulis = obs.as_paulis()  # 1/4 ( II + XI - IX - XX )
  • 키스킷 v2.0.0 은 SparsePauliOp 에서 SparseObservable 를 생성하는 새로운 메서드 SparsePauliOp.from_sparse_observable(). 기억해야 할 중요한 점은 SparseObservable 객체는 프로젝터를 효율적으로 표현할 수 있으며, 이는 기하급수적으로 많은 수의 SparsePauliOp.

  • SparseObservable 는 이제 compose() 메서드를 사용한 연산자 구성을 지원합니다 quantum_info 클래스와 유사합니다. 이는 행렬 곱셈과 유사하지만, 완전히 행렬이 필요 없는 방법입니다.

  • SparseObservable.BitTerm 에 새로운 어트리뷰트가 있습니다, label속성이 있으며, 여기에는 문자열 레이블에서 용어를 나타내는 데 사용되는 단일 문자 Python 문자열이 포함됩니다.

  • 메서드는 이제 StabilizerState.expectation_value() 메서드는 이제 타입의 연산자 SparsePauliOp.

합성 기능

  • 새로운 TwoQubitControlledUDecomposer 클래스를 추가하여, 다음과 같이 2 큐비트 단위를 기저 2 큐비트 분수 게이트로 분해합니다 RZZGate (또는 국부적으로 다음과 동등한 2큐비트 게이트인 RZZGate단일 큐비트 게이트까지).

    예를 들어,

    from qiskit.circuit.library import RZZGate
    from qiskit.synthesis import TwoQubitControlledUDecomposer
    from qiskit.quantum_info import random_unitary
    
    unitary = random_unitary(4, seed=1)
    decomposer = TwoQubitControlledUDecomposer(RZZGate, euler_basis="ZXZ")
    circ = decomposer(unitary)
    circ.draw(output='mpl')
  • 패스가 synth_cnot_depth_line_kms() 패스가 Rust로 포팅되었으며, 예비 벤치마크 결과 20x 속도 향상의 요인이 있는 것으로 나타났습니다.

  • 패스가 synth_cx_cz_depth_line_my() 패스가 Rust로 포팅되었으며, 예비 벤치마크 결과 70x 속도 향상의 요인이 있는 것으로 나타났습니다.

  • 합성 기능 추가 synth_integer_comparator_2s()synth_integer_comparator_greedy() 와 같은 정수 비교를 구현하는 게이트를 컴파일하기 위한 합성 함수와 IntegerComparatorGate. 이에 해당하는 하이 레벨 합성 플러그인은 IntComparatorSynthesis2sIntComparatorSynthesisNoAux. 컴파일러가 사용 가능한 보조 큐비트를 기반으로 최적의 분해를 선택하도록 하려면, 사용 가능한 보조 큐비트에 따라 IntComparatorSynthesisDefault.

  • 추가 synth_weighted_sum_carry() 를 추가하여 WeightedSumGate 객체에 추가되었습니다. 이것은 현재 유일하게 사용할 수 있는 합성 방법입니다 WeightedSumGate에 해당하는 하이 레벨 합성 플러그인인 WeightedSumSynthesisDefault.

트랜스파일러 기능

  • 임의의 각도를 포함하는 Target 객체와 임의의 각도를 포함하는 2 큐비트 베이시스 게이트를 포함하는 객체에 대한 작업이 RZZGate와 같은 임의의 각도를 포함하는 ConsolidateBlocks 트랜스파일러 패스에 추가되었습니다. 이전에는 패스가 분해에 필요한 게이트 수를 정확하게 예측하지 못해 블록이 통합되지 않는 경우가 발생했습니다 UnitarySynthesis 가 잠재적으로 블록을 최적화할 수 있는 곳에서 블록이 통합되지 않았습니다. 내부적으로 게이트 수 추정은 다음을 사용하여 수행됩니다 TwoQubitControlledUDecomposer 클래스를 사용합니다.

    예를 들어,

    from qiskit import QuantumCircuit
    from qiskit.transpiler import generate_preset_pass_manager
    from qiskit.transpiler.passes import ConsolidateBlocks
    
    qc = QuantumCircuit(2)
    qc.rzz(0.1, 0, 1)
    qc.rzz(0.2, 0, 1)
    # basis_gates contains fractional gate (rzz)
    consolidate_pass = ConsolidateBlocks(basis_gates=["rz", "rzz", "sx", "x", "rx"])
    block = consolidate_pass(qc)  # consolidate the circuit into a single unitary block
    block.draw(output='mpl')
    
    pm = generate_preset_pass_manager(
        optimization_level=2, basis_gates=["rz", "rzz", "sx", "x", "rx"]
    )
    tqc = pm.run(qc)  # synthesizing the circuit into basis gates
    tqc.draw(output='mpl')
  • 2 큐비트 분수 기반 게이트에 대한 지원이 추가되었습니다 RZZGate와 같은 2쿼비트 분수 기반 게이트에 대한 UnitarySynthesis 트랜스파일러 패스에 분해는 TwoQubitControlledUDecomposer를 사용하여 이루어지며 표준 및 사용자 정의 기준 게이트를 모두 지원합니다.

    예를 들어,

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.transpiler.passes import UnitarySynthesis
    from qiskit.converters import circuit_to_dag, dag_to_circuit
    
    unitary = random_unitary(4, seed=1)
    qc = QuantumCircuit(2)
    qc.append(unitary, [0, 1])
    dag = circuit_to_dag(qc)
    
    # basis_gates contains fractional gate (rzz)
    circ = UnitarySynthesis(basis_gates=['rzz', 'rx', 'rz']).run(dag)
    dag_to_circuit(circ).draw(output='mpl')
  • 새로운 트랜스파일러 패스를 추가했습니다, LightCone를 추가하여 큐비트의 하위 집합이나 특정 폴리 문자열을 측정할 때 회로의 라이트콘을 반환합니다.

    예를 들어 다음 회로의 경우입니다:

    _images/release_notes-3.png

    패스를 실행하면 결과에 영향을 미치지 않는 게이트가 제거됩니다:

    from qiskit.transpiler.passes.optimization.light_cone import LightCone
    from qiskit.transpiler.passmanager import PassManager
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3,1)
    qc.h(range(3))
    qc.cx(0,1)
    qc.cx(2,1)
    qc.h(range(3))
    qc.measure(0,0)
    
    pm = PassManager([LightCone()])
    new_circuit = pm.run(qc)
    new_circuit.draw("mpl")
    _images/release_notes-4.png
  • 클래스에 새 인수 max_block_width 를 추가했습니다 BlockCollector 클래스와 CollectLinearFunctionsCollectCliffords 트랜스파일러 패스를 추가했습니다. 이 인수를 사용하면 노드 블록이 정의되는 최대 큐비트 수를 제한할 수 있습니다.

    예를 들어,

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import CollectLinearFunctions
    
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, 1)
    qc.cx(1, 2)
    qc.cx(2, 3)
    qc.cx(3, 4)
    
    # Collects all CX-gates into a single block 
    qc1 = CollectLinearFunctions()(qc)
    qc1.draw(output='mpl')
    
    # Collects CX-gates into two blocks of width 3 
    qc2 = CollectLinearFunctions(max_block_width=3)(qc)
    qc2.draw(output='mpl')
  • 새로운 옵션인 collect_from_backCollectMultiQBlocks 트랜스파일러 패스에 추가했습니다. True 로 설정하면 블록이 출력에서 회로의 입력 방향으로 역방향으로 수집됩니다. 블록은 여전히 일반적인 토폴로지 순서에 따라 보고됩니다. 이는 패스가 제공하는 추가적인 유연성과 회로 재합성 방법과 결합할 경우 추가적인 최적화 기회로 이어집니다.

  • 에 새로운 approximation_degree 인수를 추가했습니다 CommutationAnalysis. 이 인수를 사용하면 게이트가 통근으로 평가되는 시점에 대한 근사 임계값을 설정할 수 있습니다. 자세한 내용은 클래스 문서 문자열을 참조하세요.

  • 새로운 트랜스파일러 패스, ContractIdleWiresInControlFlow를 사용할 수 있습니다 qiskit.transpiler.passes. 이 패스는 시맨틱이 허용하고 큐비트가 제어 흐름 작업 내내 유휴 상태로 유지되는 경우 제어 흐름 블록에서 큐비트를 제거합니다. 이전에는 사전 설정된 패스 관리자의 라우팅 단계에서 패스 작동 방식의 의도치 않은 부작용으로 유휴 큐비트가 제거될 수 있었습니다. 이제 이 동작은 최적화 패스의 일부로 올바르게 처리됩니다.

  • 새로운 "default" 라우팅 플러그인 단계가 추가되었습니다. 키스킷 v2.0.0 에서 이것은 이전 기본값인 "sabre" 의 별칭일 뿐입니다. 기본 기본 알고리즘은 키스킷 v2.x 릴리스 시리즈가 진행되는 동안 일부 또는 모든 대상에 대해 변경될 수 있지만, 언제든지 명시적으로 routing_method="sabre" 을 설정하여 현재 동작을 유지할 수 있습니다.

  • 새로운 "default" 번역 플러그인 단계가 추가되었습니다. 키스킷 v2.0.0 에서는 이전 기본값인 "translator" 의 별칭입니다. 기본 기본 알고리즘은 키스킷 2.x 시리즈가 진행되는 동안 일부 또는 모든 대상에 대해 변경될 수 있지만, 언제든지 translation_method="translator" 을 명시적으로 설정하여 현재 동작을 유지할 수 있습니다.

  • 이제 HighLevelSynthesis 트랜스파일러 패스는 이제 플러그인 인터페이스를 통해 AnnotatedOperation 유형의 오브젝트를 합성합니다.

  • PassManager.run() 는 이제 property_set 인수를 허용하며, 이는 파이프라인의 초기 값을 제공하기 위해 Mapping-같은 객체로 설정하여 파이프라인의 초기 값을 제공할 수 있습니다 PropertySet. 부분적으로 적용된 컴파일을 다시 시작하거나 이전 컴파일의 특정 분석을 새로운 위치에서 재사용하는 데 사용할 수 있습니다.

  • 스케줄링 패스 PadDelayPadDynamicalDecoupling 의 생성자에 새로운 인수가 생겼습니다: targetdurations. 이들은 Target 또는 InstructionDurations 를 지정하는 데 사용됩니다. 패스가 실행될 때 인스트럭션 기간에 액세스하려면 인수 중 하나가 필요합니다.

  • 새로운 seconds_to_dt() 메서드를 Target 클래스에 새로운 메서드를 추가했습니다. 이는 지속 시간(초)을 시스템 시간 해상도의 이산화된 여러 시간 단계로 변환하는 데 사용됩니다 Target.dt 어트리뷰트에 지정된 시스템 시간 해상도의 여러 디스크리트 시간 단계로 변환합니다. 이것은 일반적으로 InstructionProperties.duration 값을 dt 단위로 변환할 때 유용합니다.

  • 트랜스파일러 패스의 Split2QUnitaries 트랜스파일러 패스는 고려 중인 유니티를 하나의 SwapGate 게이트와 두 개의 단일 큐비트 게이트로 작성할 수 있는 경우를 처리하도록 업그레이드되었습니다. 이 경우 유니티를 분할하고 가상 스와핑도 적용하며, 이는 ElidePermutations. 이 기능은 :class`.Split2QUnitaries` 의 생성자에서 새로운 인수 split_swap 를 사용하여 제어할 수 있으며, 이 인수는 스왑 등가 게이트 분할을 비활성화하는 데 사용할 수 있습니다.

기타 기능

  • qiskit.utils 이제 키스킷의 병렬화 설정을 더 잘 제어하고 검사할 수 있는 유틸리티가 포함되어 있습니다 multiprocessing 병렬화 설정을 더 잘 제어하고 검사할 수 있는 유틸리티가 포함되어 있습니다. 특히 이제 should_run_in_parallel() 를 사용하여 parallel_map() (및 패스 관리자)가 적절한 입력에 대한 하위 프로세스를 시작할지 쿼리하고 컨텍스트 관리자 should_run_in_parallel.override() 를 사용하여 이 결정과 관련된 대부분의 시스템 및 사용자 구성을 일시적으로 재정의할 수 있습니다.

    추가 함수, default_num_processes()는 키스킷이 프로세스 기반 병렬 처리를 위해 사용할 기본 최대 서브 프로세스 수를 읽습니다.

  • 새로운 환경 변수 QISKIT_IGNORE_USER_SETTINGS 는 이제 import qiskit 에서 사용자 설정 파일을 읽을지 여부를 제어합니다. true 문자열로 설정하면 설정 파일을 읽지 않습니다. 이는 테스트와 같이 시스템 환경에서 특정 키스킷 인스턴스를 격리하는 데 유용합니다.

업그레이드 주의사항

  • 키스킷( v2.0 )은 Linux i686 및 32비트 윈도우에 대한 지원을 중단했습니다. 키스킷 v2.0.0 에서부터 키스킷을 실행하려면 64비트 플랫폼이 필요합니다. 이는 과학계 Python 커뮤니티의 추세와 일치하며, 키스킷이 점점 더 복잡해지는 양자 컴퓨팅 하드웨어의 성능 개선에 집중할 수 있게 해줍니다.

    키스킷 v1.4 은 수명 종료(2025년 9월)까지 32비트 플랫폼을 계속 지원하지만, 이번 2.0.0 릴리스부터는 더 이상 32비트 플랫폼을 위해 미리 컴파일된 바이너리를 게시하지 않으며, 32비트 플랫폼에서 성공적인 소스 빌드를 보장하지 않습니다.

  • 소스에서 키스킷을 빌드하기 위해 지원되는 최소 Rust 버전은 이제 v1.79 이다. 이는 키스킷 v1.x 릴리스 시리즈의 이전 최소 지원 Rust 버전인 v1.70 에서 상향되었습니다.

  • 키스킷 펄스는 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 이번 릴리스에서 완전히 제거되었습니다. 여기에는 모든 펄스 모듈 파일, 펄스 시각화 기능, ScheduleBlock 및 QPY의 펄스 게이트 직렬화 및 역직렬화 지원, 캘리브레이션 관리가 포함됩니다 QuantumCircuit, TargetDAGCircuit및 펄스 기반 가짜 백엔드. 펄스와 관련된 제거된 구성 요소에 대한 자세한 내용은 아래 해당 섹션을 참조하세요.

    펄스 사용 중단에 따른 초기 계획과 마찬가지로 키스킷 다이내믹스로의 펄스 마이그레이션은 키스킷 다이내믹스 개발 우선순위로 인해 보류되었음을 알려드립니다. 키스킷 펄스를 백엔드 지원을 위한 프론트엔드로 사용하거나 다른 사용 사례에서 사용하고자 하는 사용자는 펄스 기능이 포함된 v2.0.0 이전 키스킷 버전에서도 계속 사용할 수 있습니다.

  • 모듈의 sequenceschedule 함수는 compiler 모듈의 함수는 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이들은 백엔드 정의를 사용하여 회로를 펄스 구성 요소로 변환할 수 있는 기능에 의존했는데, 이 기능은 더 이상 존재하지 않습니다. 이러한 이유로 대안이 제시되지 않은 채 삭제되었습니다. 이러한 제거는 펄스 패키지와 관련이 있으며, 키스킷 2.0 에서도 제거되고 있습니다.

회로 업그레이드 노트

  • BitRegister 와 그 하위 클래스 클래스는 Python 으로의 변환으로 인해 Python 에 노출된 각 인스턴스를 다시 할당할 수 있으므로 is 검사를 사용하여 더 이상 비교가 보장되지 않습니다.

  • BitRegister (및 그 서브클래스)는 더 이상 서브클래싱할 수 없습니다. 이는 지원되는 동작이 아니며, 그렇게 하면 키스킷에서 지정되지 않은 동작이 발생할 수 있습니다. 더 이상 클래스의 구현 세부 사항으로 이 작업을 수행할 수 없습니다.

  • 더 이상 베이스의 인스턴스를 생성할 수 없습니다 BitRegister 클래스의 인스턴스를 생성할 수 없습니다. 이러한 클래스를 직접 인스턴스화하는 것은 지원되지 않는 것으로 명확하게 문서화되어 있었고, 이전 릴리스에서는 클래스 계층 구조의 구현 아티팩트에 불과했습니다. 키스킷( v2.0.0 )부터는 더 이상 이 작업을 수행할 수 없습니다.

  • qiskit.circuit.classicalfunction 모듈은 키스킷 v1.4 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 여기에는 ClassicalFunction 클래스, 관련 classical_function 함수, BooleanExpression 클래스가 포함됩니다. 이 변경은 더 이상 키스킷의 모든 지원 플랫폼 및 Python 버전과 호환되지 않는 tweedledum 라이브러리에 대한 종속성을 제거하기 위해 이루어졌습니다. ClassicalFunction 에서 독점적으로 사용되던 PhaseOraclestring 형식의 표현식만 허용하도록 업그레이드되었습니다(다음 릴리스 노트 참조). BooleanExpression 가 새로운 BitFlipOracleGate 클래스로 대체되었습니다.

  • 클래스는 더 이상 PhaseOracle 클래스는 더 이상 tweedledum 라이브러리에 종속되지 않으므로 종속성이 적극적으로 유지되지 않습니다. 인터페이스가 간소화되어 더 이상 synthesizer 매개변수를 허용하지 않으며 expression 매개변수는 문자열만 사용할 수 있습니다. 이전에 허용되었던 ClassicalFunction 유형은 키스킷 v1.4 에서 더 이상 사용되지 않으며, 키스킷 v2.0 에서 제거되었습니다.

    이러한 업그레이드에도 불구하고 표준 사용법은 그대로 유지됩니다 PhaseOracle 클래스의 표준 사용법은 변경되지 않습니다:

    from qiskit.circuit.library.phase_oracle import PhaseOracle
    bool_expr = "(x0 & x1 | ~x2) & x4"
    oracle = PhaseOracle(bool_expr)
    oracle.draw('mpl')
    _images/release_notes-5.png

    이 변경은 합성 효율성에 영향을 줄 수 있지만, 키스킷이 지원하는 모든 플랫폼 및 Python 버전과의 호환성을 위해 필요했습니다.

  • 에서 통근을 확인하는 데 사용되는 메트릭을 업데이트했습니다 CommutationChecker. 커뮤테이션의 평균 게이트 충실도가 (1 - 1e-12) 이상이면 두 개의 게이트가 커뮤테이션하는 것으로 가정합니다. 이 값은 충실도 계산에서 반올림 오류를 고려하고 RemoveIdentityEquivalentTwoQubitWeylDecomposition. 자세한 내용은 클래스 문서 문자열을 참조하세요.

  • 메서드 QuantumCircuit.measure_active() 는 이전 이름이 OpenQASM 예약어와 충돌하여 생성하는 클래식 레지스터의 이름을 변경했습니다. measure 대신 이제 meas 으로 변경되며, 이는 measure_all().

  • 메서드가 DAGCircuit.control_flow_op_nodes() 메서드가 비어 있어도 항상 목록을 반환하도록 업데이트되었습니다. 이전에는 비어 있으면 None 을 반환했고, 특별한 처리가 필요한 빈 목록은 반환하지 않았습니다. 키스킷 v1.x 과 v2.x 모두에서 명시적으로 비어 있는지 테스트해야 하는 경우, 할 수 있습니다:

    control_flow_nodes = dag.control_flow_op_nodes()
    if not control_flow_nodes:
        # There are no control-flow nodes.
        pass
  • BlueprintCircuit.copy_empty_like() 은 이제 원래 회로와 동일한 수의 큐비트와 클릿, 동일한 메타데이터를 가진 빈 QuantumCircuit 대신 동일한 수의 큐비트와 클릿, 그리고 원래 회로와 동일한 메타데이터를 가진 BlueprintCircuit 을 반환합니다. 이 변경 사항은 블루프린트 회로의 '빈' 복사본을 처리하면 회로 데이터가 다시 빌드되는 예기치 않은 동작을 해결합니다. BlueprintCircuit.copy() 은 여전히 BlueprintCircuit 을 반환합니다. BlueprintCircuit 은 레거시 항목을 빌드하는 데 사용되는 내부 유형이므로 공용 클래스는 아니지만 qiskit.circuit.library 에서 레거시 항목을 빌드하는 데 사용되는 내부 유형이므로 NLocalZZFeatureMap. 이 변경의 영향을 받는 클래스 전체 목록은 qiskit.circuit.library 에서 이 변경의 영향을 받는 클래스의 전체 목록을 확인하세요. 수정 #13535

  • 내부 기능 qiskit.circuit.add_control.add_control 이 제거되었습니다. 이 기능은 공개 API의 일부가 아니었기 때문에 지켜야 할 전제 조건이 취약하고 버그가 자주 발생했습니다. add_control(SomeGate(...), ...) 대신 SomeGate(...).control(...) 으로 변경해야 합니다 Gate.control() 로 변경하는 것이 훨씬 안전합니다.

  • 메서드 ParameterExpression.sympify() 메서드는 이제 sympy 이 설치되지 않은 경우 MissingOptionalLibrary 예외를 발생시킬 수 있습니다. 키스킷 v1.x 릴리스에서는 sympy 이 항상 설치되도록 보장되었지만 v2.0.0 부터는 더 이상 필수 요구 사항이 아니며 이 방법을 사용하는 경우에만 필요할 수 있습니다. 이 기능에는 명시적으로 sympy 이 필요하므로 이 방법을 사용하려면 sympy 이 설치되어 있는지 확인해야 합니다.

  • 더 이상 사용되지 않는 DAGNode dag 인수가 클래스 및 하위 클래스에서 제거되었습니다 DAGNode 클래스와 그 서브클래스에서 제거되었습니다: DAGOpNode, DAGOutNodeDAGInNode.

    dag 매개 변수는 이러한 객체를 구성할 때 선택적 인수가었지만 v1.3 릴리스 이후에는 사용되지 않고 무시되었으며 v1.4 릴리스 이후에는 더 이상 사용되지 않습니다.

  • 다음 QuantumCircuit 메서드:

    • cast
    • cbit_argument_conversion
    • cls_instances
    • cls_prefix
    • qbit_argument_conversion

    은 Qiskit 1.2 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이러한 메서드는 내부 도우미 함수이며 공개 API를 위한 것이 아닙니다. 대체품은 제공되지 않습니다.

  • 더 이상 사용되지 않는 속성 InstructionGatedurationunit 속성이 제거되었으므로 더 이상 unit 또는 duration 인수를 설정할 수 없습니다 qiskit.circuit.Instruction 또는 서브클래스에 대해 인수를 설정할 수 없습니다. 이러한 속성은 키스킷 v1.3.0 에서 더 이상 사용되지 않으며, 개별 명령어에 사용자 지정 실행 기간과 해당 기간의 단위를 첨부하는 데 사용되었습니다. 그러나 게이트 기간의 진실의 출처는 BackendV2 Target이며, 여기에는 백엔드에서 지원되는 각 명령어의 지속 시간이 포함되어 있습니다. 인스트럭션의 지속 시간은 일반적으로 사용자가 조정할 수 없으며 백엔드의 불변 속성입니다. 이전에 이 기능을 사용하여 다양한 게이트 지속 시간을 실험한 경우, 주어진 게이트의 InstructionProperties.duration 필드를 변경하여 Target 필드를 변경하여 백엔드에서 인스트럭션에 대한 사용자 지정 기간을 설정할 수 있습니다. 단위는 항상 초 단위입니다( Target.)

  • 더 이상 사용되지 않는 속성 qiskit.circuit.InstructionGatecondition 의 속성이 제거되었습니다. 이 기능은 회로의 기존 상태를 설명하는 데 사용할 수 있는 IfElseOp 클래스로 대체되었으며, 회로의 고전적인 조건을 설명하는 데 사용할 수 있습니다. 이 속성은 v1.3.0 릴리스에서 더 이상 사용되지 않습니다.

  • 더 이상 사용되지 않는 메서드 InstructionGatec_ifcondition_bits 메서드가 제거되었습니다. 이러한 메서드는 v1.3.0 릴리스에서 더 이상 사용되지 않습니다. 이 기능은 회로의 기존 상태를 설명하는 데 사용할 수 있는 IfElseOp 클래스로 대체되었으며, 회로의 고전적인 조건을 설명하는 데 사용할 수 있습니다. 예를 들어, 이전에 Instruction.c_if() 처럼 사용하던 회로는 다음과 같습니다:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.x(0).c_if(0, 1)
    qc.z(1.c_if(1, 0)
    qc.measure(0, 0)
    qc.measure(1, 1)

    다음으로 다시 쓸 수 있습니다.

    qc = QuantumCircuit(2, 2)
    qc.h(0)
    with expected.if_test((expected.clbits[0], True)):
        qc.x(0)
    with expected.if_test((expected.clbits[1], False)):
        qc.z(1)
    qc.measure(0, 0)
    qc.measure(1, 1)
  • 더 이상 사용되지 않는 방법 InstructionSet.c_if 이 제거되었습니다. 이 방법은 1.3.0 릴리스에서 더 이상 사용되지 않습니다. 이 기능은 회로의 기존 상태를 설명하는 데 사용할 수 있는 IfElseOp 클래스로 대체되었으며, 회로의 고전적인 조건을 설명하는 데 사용할 수 있습니다.

  • 키스킷의 펄스 제거의 일환으로 v2.0.0 에서 calibrations 속성이 제거되었습니다 QuantumCircuit, DAGCircuitDAGDependency 클래스에서 제거되었다. 이 외에도 has_calibration_for 메서드가 제거되었습니다 QuantumCircuitDAGCircuit 클래스에서 제거되었고 add_calibrationQuantumCircuit.

  • qiskit.circuit.classicalfunction 모듈이 제거되었습니다. 이 모듈은 Python 의 최신 버전과 호환되지 않는 tweedledum 라이브러리에 종속되어 있습니다. 대안으로 PhaseOracleGateBitFlipOracleGate 클래스를 사용하여 부울 표현식에서 회로를 생성할 수 있습니다.

  • 의 내부 표현은 UnitaryGate 에 추가된 경우 QuantumCircuit 의 내부 표현이 변경되었습니다. 회로에 저장된 객체는 더 이상 회로에 추가된 객체에 대한 공통 참조를 공유하지 않습니다. 이 동작은 결코 보장되지 않았으며, 객체를 직접 또는 참조로 변경하면 UnitaryGate 객체를 직접 또는 참조로 변경하는 것은 항상 안전하지 않았고 특히 매트릭스를 수정할 때 회로가 손상될 가능성이 높았습니다. 회로의 요소를 변경해야 하는 경우(비효율적이고 오류가 발생하기 쉬우므로 권장하지 않음 ) 다음과 같은 작업을 수행하세요:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import random_unitary
    from qiskit.circuit.library import UnitaryGate
    import numpy as np
    
    qc = QuantumCircuit(2)
    qc.unitary(np.eye(2, dtype=complex))
    
    new_op = UnitaryGate(random_unitary(2))
    qc.data[0] = qc.data[0].replace(operation=new_op)

    에도 적용되지만 DAGCircuit에도 적용되지만 DAGCircuit.substitute_node() 대신 사용할 수 있습니다.

  • 속성의 CircuitInstruction.params 속성을 포함하는 CircuitInstruction 의 속성은 UnitaryGate 를 포함하는 operation 속성은 더 이상 게이트의 기본 단일 행렬을 포함하지 않습니다. 이는 게이트의 내부 표현이 더 이상 행렬 객체를 파라미터로 취급하지 않기 때문입니다. 게이트의 매트릭스에 액세스해야 하는 경우에는 CircuitInstruction.matrix 또는 UnitaryGate.params 필드에 CircuitInstruction.operation.

기본형 업그레이드 노트

  • BackendV1 모델의 제거로 인해 BackendSamplerV2BackendEstimatorV2 클래스는 더 이상 backend 입력 인수에 BackendV1 유형의 입력을 허용하지 않습니다.

  • 키스킷 v1.2 에서 사용되지 않는 프리미티브 V1 구현과 V1-exclusive 비-버전 유형 별칭이 제거되었습니다. 이러한 인터페이스는 V2 으로 대체되었습니다. 제거 대상에는 V1 인터페이스를 구현하는 다음 클래스가 포함됩니다:

    또한 다음과 같은 버전이 아닌 유형 별칭도 있습니다:

    이 제거는 이전 버전과의 호환성을 유지하기 위해 명시적으로 버전이 지정된 BaseEstimatorV1BaseSamplerV1 추상 인터페이스 정의나 관련 결과 및 작업 클래스에는 영향을 미치지 않습니다. BaseEstimator 과 같이 버전이 지정되지 않은 V1-type 별칭을 사용하는 경우 버전이 지정된 유형으로 직접 바꿀 수 있습니다(BaseEstimatorV1).

    또한 다음과 같은 유틸리티 기능이 제거되었습니다. 이러한 함수는 프리미티브 V1 구현에서만 사용되었습니다:

공급자 업그레이드 안내

  • configuration 메서드 BasicSimulator 메서드는 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이 메서드는 BackendConfiguration 인스턴스를 반환했는데, 이 클래스는 중단된 BackendV1 워크플로우의 일부였으며 키스킷 v2.0.0 에서도 제거된 클래스입니다. 개별 구성 요소는 이제 백엔드에서 직접 검색하거나 포함된 Target 인스턴스 (backend.target).

  • run_experiment 메서드 BasicSimulator 메서드가 제거되었습니다. 이 메서드는 QasmQobjExperiment 클래스의 인스턴스를 입력 인자로 취하는데, 이 클래스는 키스킷 v1.2 이후 더 이상 사용되지 않으며 키스킷 Qobj 의 v2.0.0 워크플로에서 제거된 클래스입니다.

  • BackendV1 모델은 키스킷 1.2.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 여기에는 BackendV1 클래스와 관련 모듈 및 유틸리티가 포함됩니다 BackendV2 모델로 대체되었기 때문입니다. 제거된 항목 목록에는 다음이 포함됩니다:

    • BackendV1 클래스: 제거된 모델의 핵심

    • qiskit/providers/models 의 모든 요소는 BackendV1 모델의 구성 요소를 나타내는 데 사용되었습니다:

      • BackendConfiguration
      • BackendProperties
      • BackendStatus
      • QasmBackendConfiguration
      • PulseBackendConfiguration
      • UchannelLO
      • GateConfig
      • PulseDefaults
      • PulseQobjDef
      • Command
      • GateProperties
      • Nduv
      • JobStatus: 이 클래스는 더 널리 사용되는 JobStatus
      • PulseDefaults
    • BackendV2Converter class: BackendV1 에서 BackendV2

    • convert_to_target 함수: 기존 컴포넌트에서 Target 레거시 BackendV1 컴포넌트(예: BackendConfiguration 또는 BackendProperties)에서 인스턴스를 빌드하는 데 사용됩니다

    • BackendPropertyErrorBackendConfigurationError: 제거된 클래스에 연결된 예외

  • 백엔드는 BasicSimulator 백엔드는 더 이상 기존 제어 흐름을 시뮬레이션할 수 없습니다. 제어 흐름 모델링을 위해 .c_if()/.condition 을 사용하는 것만 지원했지만, 이제 이 구조는 키스킷 데이터 모델에서 제거되었습니다.

  • 더 이상 사용되지 않는 BackendV1 기반의 모든 가짜 백엔드 클래스는 providers.fake_provider 모듈에서 제거되었습니다. 이러한 클래스는 키스킷 1.2 이후 더 이상 사용되지 않으며, 사용되지 않는 BackendV1 워크플로우의 일부였습니다. 테스트에서의 사용은 사용자 정의 인스턴스를 생성할 수 있는 GenericBackendV2 클래스로 대체되었습니다 BackendV2 의 사용자 정의 인스턴스를 만들 수 있습니다 BackendV2.run(). 제거하면 영향을 받습니다:

    • 기본 클래스:

      • FakeBackend
      • FakePulseBackend
      • FakeQasmBackend
    • 특수 테스트 목적의 가짜 백엔드:

      • Fake1Q
      • FakeOpenPulse2Q
      • FakeOpenPulse3Q
    • 레거시 가짜 백엔드:

      • Fake5QV1
      • Fake20QV1
      • Fake7QPulseV1
      • Fake27QPulseV1
      • Fake127QPulseV1
  • 키스킷 v2.0.0 에서 펄스 제거의 일환으로 다음과 같은 방법이 제거되었습니다:

    • qiskit.providers.BackendV2.instruction_schedule_map
    • qiskit.providers.BackendV2.drive_channel
    • qiskit.providers.BackendV2.measure_channel
    • qiskit.providers.BackendV2.acquire_channel
    • qiskit.providers.BackendV2.control_channel
  • 키스킷에서 펄스 제거의 일환으로 v2.0.0 에서 펄스 지원이 제거되었습니다 GenericBackendV2. 여기에는 사용자 지정 보정(calibrate_instructions 인수) 및 펄스 채널 속성(drive_channel, measure_channel, acquire_channel, control_channel)을 사용하여 백엔드를 초기화하는 기능이 포함됩니다.

  • 키스킷 v1.1.0 이후 더 이상 사용되지 않는 추상 베이스 클래스 ProviderProviderV1 를 제거했습니다. 이러한 인터페이스 정의에서 제공하는 추상화에는 name, backends, get_backend() 메서드만 포함되어 있어 큰 가치를 제공하지 못했습니다.

    로바이더는 개념상 백엔드의 모음으로 계속 존재할 것입니다. 현재 공급자를 구현 중인 경우 구현의 부모 클래스로 ProviderV1 을 제거하여 코드를 조정할 수 있습니다.

    이 변경 사항의 일부로 이전 버전과의 호환성을 위해 get_backend 구현을 추가할 수 있습니다. 예를 들어,

    def get_backend(self, name=None, **kwargs):
      backend = 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]

QPY 업그레이드 노트

  • 이제 qpy.load() 함수는 이제 symengine 심볼릭 표현식을 사용하는 QPY v10, v11, 또는 v12 페이로드가 전달되고 symengine 가 설치되지 않은 경우 MissingOptionalLibrary 예외를 발생시킬 수 있습니다. v13 이전에 다른 QPY 페이로드에 대해 sympy 가 설치되지 않은 경우에도 예외가 발생합니다. 키스킷 v1.x 릴리스에서는 symenginesympy 이 항상 설치되도록 보장되었습니다. 그러나 v2.x 부터는 더 이상 필수 요건이 아니며 symengine 을 사용하여 생성된 QPY 파일을 역직렬화하는 경우에만 필요할 수 있습니다. 이러한 QPY 페이로드를 구문 분석하려면 symengine 이 필요하며, 이는 QPY v10, v11, v12 의 형식 사양의 일부이기 때문입니다. 페이로드에 필요한 경우 호환되는 symengine (0.11.0 또는 0.13.0)의 버전을 설치하는 것이 유일한 옵션입니다. 마찬가지로 sympyParameterExpression 인코딩에 사용되었습니다.

  • 최소 QPY 호환 버전 QPY_COMPATIBILITY_VERSION이 10( v1.x 릴리스 요구 사항)에서 13으로 상향되었습니다. 이 버전은 함수에서 방출할 수 있는 최소 QPY 버전을 제어합니다 qpy.dump() 함수에 의해 방출할 수 있는 최소 버전을 제어합니다. 이는 qpy.dump() 는 이번 릴리스에서 QPY v13 및 v14 만 방출할 수 있습니다. QPY v13 는 여전히 키스킷 v1.3.x 및 v1.4.x 과 호환되므로, QPY v13 를 사용하여 키스킷 v2.x 에서 생성된 페이로드는 여전히 키스킷 v1.x 릴리스 시리즈와 함께 로드할 수 있습니다.

    이 변경은 QPY 버전 10 -12에서는 sympy 또는 symengine 라이브러리가 객체에 대한 직렬화를 생성하기 위해 ParameterExpression 객체에 대한 직렬화를 생성해야 하지만, 키스킷 2.x 에서는 두 라이브러리 모두 ParameterExpression 객체에는 두 라이브러리가 필요하지 않습니다.

  • 키스킷 v2.0.0 에서 펄스가 제거됨에 따라 ScheduleBlock 프로그램을 직렬화하기 위한 qiskit.qpy.dump() 기능이 제거되었습니다. 사용자는 여전히 펄스 게이트가 포함된 페이로드를 로드할 수 있지만 qiskit.qpy.load() 함수를 사용하여 페이로드를 로드할 수 있지만 불투명한 사용자 지정 명령으로 처리됩니다. ScheduleBlock 페이로드 로딩은 더 이상 지원되지 않으며 예외가 발생합니다 QpyError 예외가 발생합니다.

합성 업그레이드 노트

  • atomic_evolution 의 호출 가능 인자 ProductFormula (및 그 서브 클래스 QDrift, LieTrotterSuzukiTrotter )에는 새로운 함수 서명이 있습니다. 이전 서명은 폴리 연산자와 시간 계수를 사용하여 진화 회로를 반환합니다:

    def atomic_evolution(pauli_op: SparsePauliOp, time: float) -> QuantumCircuit:
      evol_circuit = QuantumCircuit(pauli_op.num_qubits)
      # append operators to circuit
      return evol_circuit

    새 서명은 기존 회로를 직접 가져와서 제공된 폴리의 진화와 주어진 시간을 이 회로에 추가해야 합니다:

    def atomic_evolution(evol_circuit: QuantumCircuit, pauli_op: SparsePauliOp, time: float):
      # append operators to circuit, in-place modification

    이 새로운 구현은 훨씬 더 나은 성능의 이점을 제공합니다.

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

  • 게이트가 아이덴티티로 간주되는 최소 임계값을 기계 엡실론에서 RemoveIdentityEquivalent 에서 기계 엡실론에서 1e-12 로 변경하여 충실도 계산의 반올림 오류를 고려하고 다른 클래스와의 일관성을 위해 CommutationAnalysisTwoQubitWeylDecomposition.

  • 라우팅 플러그인 스테이지 이름 default 은 이제 같은 이름의 키스킷 빌트인 플러그인을 위해 예약되었습니다.

  • 이제 기본 라우팅 플러그인 단계는 "default" 입니다. 키스킷 v2.0.0 에서 이것은 이전 기본값인 "sabre" 의 별칭일 뿐입니다. 기본 기본 알고리즘은 키스킷 v2.x 릴리스 시리즈가 진행되는 동안 일부 또는 모든 대상에 대해 변경될 수 있지만, 언제든지 routing_method="sabre" 을 명시적으로 설정하여 현재 동작을 유지할 수 있습니다.

  • 번역 플러그인 스테이지 이름 default 은 이제 같은 이름의 키스킷 빌트인 플러그인을 위해 예약되었습니다.

  • 이제 기본 번역 플러그인 단계는 "default" 입니다. 키스킷 2.0 에서 이것은 이전 기본값인 "translator" 의 별칭일 뿐입니다. 기본 기본 알고리즘은 키스킷 2.x 시리즈가 진행되는 동안 일부 또는 모든 대상에 대해 변경될 수 있지만, 언제든지 translation_method="translator" 을 명시적으로 설정하여 현재 동작을 유지할 수 있습니다.

  • 기존 스케줄링 패스는 ASAPSchedule, ALAPSchedule, DynamicalDecoupling, AlignMeasures 이 업데이트된 대체 패스를 위해 제거되었습니다 ALAPScheduleAnalysis, ASAPScheduleAnalysis, PadDynamicalDecouplingConstrainedReschedule 로 대체되었습니다. 이 기능은 새로운 스케줄링 워크플로우가 기존 워크플로우를 대체한 후 키스킷 v1.1 에서 더 이상 사용되지 않습니다.

  • target 또는 basis_gates 세트가 지정되지 않은 경우, 트랜스파일러 패스는 HighLevelSynthesis 트랜스파일러 패스는 이전보다 적은 수의 래핑 레이어로 주석이 달린 연산을 사용하여 회로를 합성합니다(예를 들어, 다음에 의해 생성된 회로에서 발생합니다 multiplier_cumulative_h18()).

  • 키워드 인수 property_set 는 이제 BasePassManager.run()로 예약되며, 하위 클래스가 프론트엔드 표현에서 내부 표현으로 변환할 때 전달되는 kwarg 로 사용할 수 없습니다.

  • 키스킷에서 번역 파이프라인에서 더 이상 사용되지 않는 BackendProperties 객체의 다음 사용법이 제거되었다 2.0:

    또한 다음 패스는 target 대신 다음 주소만 허용하도록 업데이트되었습니다:

    BackendProperties 클래스는 BackendV1 워크플로우의 일부였기 때문에 키스킷 v1.2 이후 더 이상 사용되지 않습니다. 게이트 오류나 지속 시간과 같은 특정 인스트럭션 속성을 Target 메서드를 통해 생성 시 Target.add_instruction() 메서드를 통해 추가할 수 있으며, target 입력 인수를 통해 관련 트랜스파일러에 전달됩니다.

  • BackendV1 모델이 제거됨에 따라 다음 트랜스파일러 객체의 허용 입력 유형이 업데이트되었습니다:

    • 그리고 generate_preset_pass_manager()transpile() 함수는 더 이상 backend 입력 인수에 BackendV1 형식의 입력을 허용하지 않습니다.
    • 메서드의 Target.from_configuration() 메서드는 더 이상 backend_properties 인수를 허용하지 않습니다
    • Target.target_to_backend_properties() 메서드가 제거되었습니다
  • 이제 ResetAfterMeasureSimplification 트랜스파일러 패스는 이제 IfElseOp 의 실행을 조절하기 위해 XGate 를 사용하여 게이트에 condition 어트리뷰트를 설정하는 대신 실행을 조건화합니다. 이는 키스킷 데이터 모델에서 condition 속성이 제거되었기 때문입니다.

  • 더 이상 사용되지 않는 ConvertConditionsToIfOps 트랜스파일러 패스가 제거되었습니다. 클래스의 기본 condition 어트리뷰트가 Instruction 클래스가 제거되었으므로 이 트랜스파일러 패스는 더 이상 변환할 대상이 없습니다. 대신 직접 IfElseOp 를 사용하여 연산 실행을 고전적으로 조건화해야 합니다.

  • 그리고 PadDelayPadDynamicalDecoupling 트랜스파일러 패스는 이제 생성 시 새 인수가 필요합니다. target 또는 durations 을 지정해야 합니다 Target 또는 InstructionDurations 로 지정해야 합니다. 이러한 패스가 없으면 패스가 회로의 명령어 지속 시간을 결정할 수 없으며 오류가 발생합니다. 이전에는 이러한 패스가 현재 제거된 duration 속성에서 이러한 값을 결정했습니다 Instruction 객체의

  • 이전에 사용되지 않던 AlignMeasures 트랜스파일러 패스가 제거되었습니다. 이 패스는 키스킷 v1.1.0 에서 더 이상 사용되지 않습니다. 대신 ConstrainedReschedule 패스를 사용해야 합니다. ConstrainedReschedule 는 동일한 기능을 수행하며 추가 타이밍 제약 조건에 맞게 정렬하는 기능도 지원합니다.

  • 를 사용하여 예약하는 경우 generate_preset_pass_manager() 또는 transpile()인수를 지정할 때 instruction_durations 인수를 지정하면 기간은 list 로 형식이 지정되며 dt 단위로 지정됩니다. 또한 번역 함수의 dt 입력 인수를 설정해야 합니다.

  • 더 이상 사용되지 않는 DAGNode.sort_key 속성을 제거했습니다. 이 속성은 키스킷 v1.4.0 릴리스에서 더 이상 사용되지 않습니다. 사전적 토폴로지 정렬은 Rust에서 내부적으로 수행되고 정렬 키 속성이 사용되지 않았기 때문에, 이 속성은 DAG 노드 생성으로 인한 오버헤드를 피하기 위해 제거되었습니다. 정렬 키에 의존하는 경우 다음과 같은 방법을 사용하여 주어진 노드에서 재생산할 수 있습니다:

    def get_sort_key(node: DAGNode):
        if isinstance(node, (DAGInNode, DAGOutNode)):
            return str(node.wire)
        return ",".join(
            f"{dag.find_bit(q).index:04d}" for q in itertools.chain(node.qargs, node.cargs)
        )
  • 다음 transpile()generate_preset_pass_manager() 입력 인수는 키스킷 1.3 이후 더 이상 사용되지 않으며, API에서 제거되었습니다:

    • instruction_durations
    • timing_constraints

    이 외에도 basis 게이트 인수를 통한 사용자 정의 기준 게이트의 지정은 transpile()generate_preset_pass_manager()(또한 키스킷 1.3 에서 더 이상 사용되지 않음)을 통한 커스텀 베이스 게이트 지정은 더 이상 허용되지 않으며, 이러한 경우 ValueError 이 발생하게 됩니다.

    이전에 제공된 정보는 backend 또는 target 인수를 통해 계속 지정할 수 있습니다. 정의된 인스트럭션 지속 시간을 사용하여 Target 인스턴스를 빌드할 수 있습니다:

    Target.from_configuration(..., instruction_durations=...)

    특정 시간 제약이 있는 경우:

    Target.from_configuration(..., timing_constraints=...)

    또한 사용자 지정 기준 게이트의 경우 대상에 수동으로 추가하거나 사용자 지정 이름 매핑과 함께 .from_configuration 을 사용할 수 있습니다:

    from qiskit.circuit.library import XGate
    from qiskit.transpiler.target import Target
    
    basis_gates = ["my_x", "cx"]
    custom_name_mapping = {"my_x": XGate()}
    target = Target.from_configuration(
        basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping
    )
  • 그리고 transpile()generate_preset_pass_manager() 인터페이스는 이제 coupling_map 및/또는 basis_gates 와 함께 backend 를 제공할 때 UserWarning 를 발생시킵니다. 이러한 경우 진실의 출처가 여러 개이고 사용자의 의도가 항상 명확하지 않으며 generate_preset_pass_manager() 해결 방법을 모를 수도 있습니다. 제안된 대안은 선택한 제약 조건을 결합한 사용자 지정 타겟을 정의하는 것입니다.

    이러한 상황 중 하나는 사용자 지정 coupling_map 과 함께 backend 또는 basis_gates 에서 큐비트 3개 이상의 게이트 사양을 지정하는 것입니다. 커플링 맵은 게이트의 동작을 결정하는 데 필요한 연결 세부 정보를 제공하지 않습니다. 이러한 경우 transpile()generate_preset_pass_manager() 이제 ValueError.

  • Qiskit 2.0 에서 펄스 제거의 일환으로 트랜스파일러의 모든 펄스 및 캘리브레이션 관련 기능이 제거되었습니다.

    다음 패스와 기능이 제거되었습니다:

    • qiskit.transpiler.passes.PulseGates 통과
    • qiskit.transpiler.passes.ValidatePulseGates 통과
    • qiskit.transpiler.passes.RXCalibrationBuilder 통과
    • qiskit.transpiler.passes.RZXCalibrationBuilder 통과
    • qiskit.transpiler.passes.RZXCalibrationBuilderNoEcho 통과
    • qiskit.transpiler.passes.EchoRZXWeylDecomposition 통과
    • qiskit.transpiler.passes.NoramlizeRXAngle 통과
    • qiskit.transpiler.passes.rzx_templates() 함수

    다음 요소에서 inst_map 인수가 제거되었습니다:

    보정 지원이 제거되었습니다:

    • calibration 는 생성자에서 제거되었으며 InstructionProperties 생성자에서 제거되어 더 이상 해당 클래스의 프로퍼티가 아닙니다.
    • has_calibration, get_calibration, instruction_schedule_mapupdate_from_instruction_schedule_map 메서드가 클래스에서 제거되었습니다 Target 클래스에서 제거되었습니다.
  • 더 이상 사용되지 않는 StochasticSwap 트랜스파일러 패스와 이와 관련된 기본 제공 라우팅 단계 플러그인 "확률적"이 제거되었습니다. 이는 키스킷 v1.3.0 릴리스에서 더 이상 사용되지 않는 것으로 표시되었습니다. 패스는 더 나은 성능과 출력 품질을 제공하는 SabreSwap 클래스로 대체되었으며, 더 나은 성능과 출력 품질을 제공하므로 대신 사용해야 합니다. 예를 들어, 이전에 트랜스파일 함수를 통해 패스를 호출한 경우와 같이 말이죠:

    from qiskit import transpile
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.providers.fake_provider import GenericBackendV2
    
    
    qc = QuantumCircuit(4)
    qc.h(0)
    qc.cx(0, range(1, 4))
    qc.measure_all()
    
    cmap = CouplingMap.from_heavy_hex(3)
    backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap)
    
    tqc = transpile(
        qc,
        routing_method="stochastic",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )

    로 대체해야 합니다:

    tqc = transpile(
        qc,
        routing_method="sabre",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )
  • qiskit.transpiler.passes.CXCancellation 패스가 제거되었습니다. 더 일반적인 class:.InverseCancellation, 을 위해 더 이상 사용되지 않습니다. CXCancellation()InverseCancellation([CXGate()]) 와 의미적으로 완전히 동일합니다.

  • 트랜스파일러 패스는 SolovayKitaev 트랜스파일러 패스는 더 이상 to_matrix 메서드(측정, 배리어, 제어 흐름 연산 등)가 없는 단일 큐비트 연산이나 파라미터화된 단일 큐비트 연산이 포함된 회로에서 예외를 발생시키지 않고 변경하지 않고 그대로 유지합니다.

  • 이제 프리셋 패스 매니저의 번역 단계용 플러그인은 출력에서 다음 사항을 준수해야 합니다 Target 게이트 방향성을 존중해야 합니다. 이전에는 transpile()generate_preset_pass_manager() 는 필요한 경우 수정 패스가 포함된 PassManager 를 생성하여 필요한 경우 수정 패스를 포함했습니다. 이제 스테이지가 방향성을 존중하지 않는다면 사용자 지정 스테이지에 이를 포함해야 합니다.

    패스를 사용하여 GateDirection 패스를 사용하여 키스킷이 하던 것과 동일한 수정 작업을 수행할 수 있습니다. 예를 들어,

    from qiskit.transpiler import PassManager
    from qiskit.transpiler.passes import GateDirection
    from qiskit.transpiler.preset_passmanagers.plugin import PassManagerStagePlugin
    
    class YourTranslationPlugin(PassManagerStagePlugin):
        def pass_manager(self, pass_manager_config, optimization_level):
            pm = PassManager([
                # ... whatever your current setup is ...
            ])
            # Add the two-qubit directionality-fixing pass.
            pm.append(GateDirection(
                pass_manager_config.coupling_map,
                pass_manager_config.target,
            ))
            return pm
  • 프리셋 패스 관리자가 더 이상 출력의 암시적 pre_optimization 단계를 채우지 않습니다 StagedPassManager. 이제 이 필드에 자신만의 PassManager 을 이 필드에 안전하게 할당할 수 있습니다. 이전에는 기존 PassManager.

  • 인수의 기본값이 generate_routing_passmanager() 인수의 기본값 seed_transpilerNone 에서 -1 로 변경되었습니다. 이 플래그는 트랜스파일러 패스를 구성하는 데만 사용되었기 때문에 이 변경이 이루어졌습니다 VF2PostLayout 트랜스파일러 패스에만 사용되며, 해당 패스의 경우 무작위화는 일반적으로 성능을 저하시키고 바람직하지 않기 때문입니다. 이전 기본값에 의존하는 경우 seed_transpiler=None 인수를 명시적으로 설정하여 이 동작을 복원할 수 있습니다. 이 매개변수에 대한 시드 값을 명시적으로 설정한 경우에는 동작이 변경되지 않습니다.

시각화 업그레이드 안내

  • 모든 회로 서랍의 idle_wires 매개변수가 새로운 옵션인 "auto" 으로 확장되어 이제 기본 동작이 됩니다. 그래도 지침 없이 와이어를 표시하려면 idle_wires=True 을 명시적으로 설정하세요.

    "auto" 로 설정하면 동작은 다음과 같습니다:

    • 회로에 정의된 .layout 속성이 있는 경우 idle_wires 은 자동으로 False (유휴 전선 숨기기)로 설정됩니다
    • 그렇지 않으면 idle_wiresTrue (이전 기본값과 같이 모든 와이어 표시)로 유지됩니다

    다음 예는 idle_wires="auto" 을 사용하여 레이아웃이 표시되지 않은 회로를 보여줍니다:

    qr_0: ────────
          ┌───┐┌─┐
    qr_1: ┤ H ├┤M├
          └───┘└╥┘
    cr_0: ══════╬═
    
    cr_1: ══════╩═

    레이아웃이 적용되면 idle_wires="auto"idle_wiresFalse 으로 설정하여 유휴 와이어를 숨깁니다:

              ┌───┐┌─┐
    qr_1 -> 1 ┤ H ├┤M├
              └───┘└╥┘
        cr_1: ══════╩═

    배치된 회로의 모든 와이어를 표시하려면 idle_wires=True 을 명시적으로 설정하세요:

         qr_0 -> 0 ────────
                   ┌───┐┌─┐
         qr_1 -> 1 ┤ H ├┤M├
                   └───┘└╥┘
    ancilla_0 -> 2 ──────╫─
    
             cr_0: ══════╬═
    
             cr_1: ══════╩═

    양자 컴퓨터가 더 많은 큐비트로 확장됨에 따라, 작은 회로도 변환 후 큰 회로 표현을 생성할 수 있습니다. "auto" 설정은 가능한 경우 불필요한 와이어를 숨겨 가독성을 높이는 데 도움이 됩니다.

  • 기능과 array_to_latex() 함수 및 Operator.draw() 메서드는 이제 sympy 라이브러리가 설치되지 않은 경우 MissingOptionalLibrary 예외를 발생시킬 수 있습니다. 키스킷 v1.x 릴리스에서는 symenginesympy 설치가 항상 보장되었지만 v2.0.0 부터는 더 이상 강제 사항이 아닙니다. 행렬에 대한 LaTeX 시각화는 sympy 라이브러리에 의존하므로 이 기능을 사용하는 경우 sympy 이 설치되어 있는지 확인하세요.

  • BackendV1 모델이 제거됨에 따라 plot_gate_map(), plot_error_map()plot_circuit_layout() 함수는 더 이상 backend 입력 인수에 BackendV1 형식의 입력을 허용하지 않습니다.

  • 이제 타임라인 서랍을 호출할 때 target 인수를 지정해야 합니다. 인스트럭션에 더 이상 기간 속성이 포함되지 않으므로 지원되는 모든 인스트럭션의 기간을 지정하려면 이 추가 인수가 필요합니다. 인수가 없으면 타임라인 서랍은 이 정보에 액세스할 수 없습니다.

  • 키스킷에서 펄스 제거의 일환으로 2.0, qiskit.visualization.pulse_drawer 을 통한 펄스 그리기 지원이 제거되었습니다.

기타 업그레이드 주의사항

  • 키스킷 v0.24 (2023년 5월) 이후 더 이상 사용되지 않는 deprecate_functiondeprecate_arguments 데코레이터는 키스킷 v2.0.0 에서 제거되었습니다. 현재 deprecate_func()@deprecate_function 을 대체하고 현재 deprecate_arg()@deprecate_arguments 을 대체합니다.

  • assemble 함수 및 관련 기능( assembler 모듈에 포함됨)은 키스킷 v1.2 에서 더 이상 사용되지 않음에 따라 코드베이스에서 제거되었습니다. assemble 는 더 이상 사용되지 않는 BackendV1 워크플로우의 컨텍스트에서 Qobj 를 생성하는 데 사용되었습니다. 변환 및 프리미티브 파이프라인이 양자 회로를 직접 처리하므로 더 이상 변환이 필요하지 않으므로 Qobj 주소는 쓸모가 없어졌습니다.

    제거에는 다음과 같은 공개 API 구성 요소가 포함됩니다:

    • qiskit.compiler.assemble 함수
    • qiskit.assembler.assemble_circuits 함수
    • qiskit.assembler.assemble_schedules 함수
    • qiskit.assembler.disassemble 함수
    • qiskit.assembler.RunConfig 클래스
    • qiskit.circuit.Instruction.assemble 메소드
  • 키스킷 v1.2.0 에서 사용되지 않는 Qobj 구조 및 관련 클래스가 제거되었습니다. BackendV1 워크플로우의 일부로 도입되었으며 더 이상 백엔드와의 상호 작용에 필요하지 않습니다 BackendV2 백엔드와의 상호 작용에는 더 이상 필요하지 않습니다. 이 제거는 다음 클래스에 영향을 줍니다:

    • QobjExperimentHeader
    • QobjHeader
    • QasmQobj
    • QasmQobjInstruction
    • QasmQobjExperimentConfig
    • QasmQobjExperiment
    • QasmQobjConfig
    • QasmExperimentCalibrations
    • GateCalibration
    • PulseQobj
    • PulseQobjInstruction
    • PulseQobjExperimentConfig
    • PulseQobjExperiment
    • PulseQobjConfig
    • QobjMeasurementOption
    • PulseLibraryItem
  • 이전에 qobj/utils.py 에 정의되었던 MeasLevelMeasReturnType 클래스는 qobj 모듈이 제거된 후 result/models.py 으로 마이그레이션되었습니다. 이러한 클래스는 공개 API에 포함되지 않았습니다. 가져오기 경로가 from qiskit.qobj.utils import MeasLevel, MeasReturnType 에서: from qiskit.result import MeasLevel, MeasReturnType.

  • 의 생성자에서 위치 인수를 사용할 수 없습니다 Result 의 생성자에서 위치 인수 사용이 비활성화되었습니다. 모든 인수는 kwarg 구문을 사용하여 설정하세요(예: Result(backend_name="name", ....)). 이 외에도 qobj_id 인수는 이제 더 이상 Result 내부. qobj_id 을 일반 kwarg로 설정하면 다른 일반 kwarg와 함께 메타데이터 필드에 표시될 수 있습니다.

  • 키스킷 2.0.0 에서 펄스 제거의 일환으로 qiskit.schedulersequenceschedule_circuit 함수와 ScheduleConfig 클래스가 제거되었습니다.

  • qiskit.result.mitigation 모듈은 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 제거 대상에는 LocalReadoutMitigatorCorrelatedReadoutMitigator 클래스와 관련 유틸리티가 포함됩니다. 해당 기능이 `mthree 애드온으로 대체되었기 때문에 키스킷에는 대체 경로가 없습니다. <https://github.com/Qiskit/qiskit-addon-mthree> `__

회로 사용 중단

  • 더 이상 사용되지 않는 QuantumCircuit.duration 속성은 원래 계획대로 이번 릴리스에서 제거되지 않았습니다. 대신 키스킷 v3.0.0 릴리즈의 일부로 제거될 예정입니다. 이 기능은 대신 사용해야 하는 QuantumCircuit.estimate_duration() 메서드로 대체되었으므로 대신 사용해야 합니다.

  • 에 대한 더 이상 사용되지 않는 튜플형 인터페이스는 CircuitInstruction 에 대한 더 이상 사용되지 않는 튜플형 인터페이스는 원래 계획대로 이번 릴리스에서 제거되지 않았습니다. 대신 키스킷 v3.0.0 에서 제거됩니다. 대신 operation, qubitsclbits 네임드 어트리뷰트를 사용합니다.

  • 다중 제어 다중 대상 회로 클래스 MCMT 는 이제 더 이상 사용되지 않으며 다음과 같이 대체되었습니다 MCMTGate로 대체되었으며, 이는 적절한 Gate 서브클래스로 대체되었습니다. 회로 대신 게이트를 사용하면 컴파일러가 더 높은 수준의 추상화에서 객체를 추론할 수 있고 여러 합성 플러그인을 적용할 수 있습니다.

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

  • 더 이상 사용되지 않는 DAGCircuit.duration 속성은 원래 계획대로 이번 릴리스에서 제거되지 않았습니다. 대신 키스킷 v3.0.0 릴리즈의 일부로 제거될 예정입니다. 이 기능은 대신 사용해야 하는 QuantumCircuit.estimate_duration() 메서드로 대체되었으므로 대신 사용해야 합니다.

  • propagate_condition 인수의 DAGCircuit.substitute_node()DAGCircuit.substitute_node_with_dag() 는 더 이상 사용되지 않습니다. 키스킷 데이터 모델에서 Instruction.condition 이 제거됨에 따라 이 옵션은 더 이상 목적에 부합하지 않습니다. 설정되어 있으면 더 이상 적용되지 않습니다. 키스킷에서 마이그레이션하는 동안 호환성을 유지하기 위해 서명에서 제거되지 않습니다 1.x -> 2.0. 이 옵션은 키스킷 3.0 에서 제거될 예정입니다.

  • 기능 generate_pre_op_passmanager() 함수는 더 이상 사용되지 않습니다. 이 기능은 더 이상 키스킷 프리셋 패스 매니저에서 사용되지 않으며, 원래 ISA 방향성을 존중하지 않는 번역 플러그인을 위한 수정 단계를 생성하기 위해 만들어졌기 때문에 그 용도가 사라졌습니다. 이제 번역 단계는 방향성을 존중해야 하므로 해당 기능은 필요하지 않으며 대부분 교체할 필요가 없습니다.

보안 문제점

  • 의 보안 취약점을 수정했습니다 qpy.load()sympy 를 사용하여 직렬화하는 페이로드 로드 시 보안 취약점 수정 ParameterExpression 객체 및 기타 기호 표현식을 직렬화하는 페이로드를 로드할 때의 보안 문제를 수정했습니다. 여기에는 QPY 버전 < 10을 사용하는 모든 QPY 페이로드가 포함될 수 있으며, 직렬화 단계에 사용되는 기호 인코딩에 따라 선택적으로 10, 11, 12(qpy.dump()).

버그 수정

  • 동일성에 근접한 게이트를 처리할 때 트랜스필레이션 프로세스의 불일치를 수정했는데, 이러한 게이트가 모든 것과 함께 이동하는 것으로 평가되었지만 CommutationAnalysis에 의해 제거되지 않고 RemoveIdentityEquivalent. 근본적인 문제는 다음과 같은 원인으로 인해 발생했습니다 RemoveIdentityEquivalentCommutationAnalysis (그리고 더 나아가 CommutativeInverseCancellation) 다른 메트릭을 사용했기 때문입니다. 이제 둘 다 평균 게이트 충실도와 동일한 임계값을 사용하여 게이트가 동일성(예: 각도가 매우 작은 회전 게이트)으로 처리되어야 하는지 여부를 평가합니다. 자세한 내용은 해당 클래스의 설명서를 참조하세요. 수정 #13547.

  • 의 버그를 수정했습니다 QuantumCircuit.assign_parameters()에서 이미 정의가 트리거된 표준 게이트에 파라미터를 할당할 때 발생하는 버그가 수정되었습니다. 이 경우 새 값이 게이트 인스턴스에 제대로 전파되지 않았습니다. 회로 자체는 여전히 예상대로 컴파일되었지만 개별 연산을 검사하면 여전히 이전 매개변수가 표시됩니다.

    예를 들어,

    from qiskit.circuit.library import EfficientSU2
    
    circuit = EfficientSU2(2, flatten=True)
    circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True)
    print(circuit.data[0].operation.params)  # would print θ[0] instead of 1.25

    13478 수정.

  • 의 버그를 수정했습니다 DAGCircuit 의 버그를 수정했습니다 Var 노드가 입력 노드가 되는 버그를 수정했습니다( deepcopy 및 피클링 중).

  • 클래스의 간과를 수정했습니다 Target 클래스에서 dt 속성에 새 값을 설정한 후 target.durations() 을 호출하면 반환된 dt 값에 업데이트된 값이 표시되지 않던 문제를 수정했습니다 InstructionDurations 객체에 표시되지 않던 문제를 수정했습니다. 이 문제는 이제 dt 세터에서 내부 타겟 인스트럭션 지속 시간 캐시의 무효화를 통해 해결되었습니다.

  • 트랜스파일러 패스의 문제를 수정했습니다 BasisTranslator 트랜스파일러 패스에서 DAG의 전역 단계가 올바르게 업데이트되지 않던 문제를 수정했습니다. 14074 수정.

  • 트랜스파일러 패스의 버그를 수정했습니다 HighLevelSynthesis 트랜스파일러 패스의 버그가 수정되어, 해당 명령어가 이미 타겟에서 지원되는지 또는 명시적으로 전달된 basis_gates 의 일부인지에 관계없이 합성 플러그인을 사용할 수 있는 모든 명령어를 합성합니다. 이제 이 동작이 수정되어 이미 지원되는 명령어가 더 이상 합성되지 않습니다.

  • 이제 InverseCancellation 트랜스필레이션 패스는 이제 제어 흐름 블록 내부에서 실행됩니다. 이전에는 클래식 블록 내에 정의된 경우 취소할 수 있는 게이트 쌍을 무시했습니다. 자세한 내용은 #13437을 참조하세요.

  • 다중 제어 회전에서 회전 각도가 a ParameterExpression. 이 경우 합성을 시도하면 바인딩되지 않은 파라미터로 게이트를 합성할 수 없다는 오류가 발생합니다. 이 버그는 다중 제어 회전 회로 메서드에 영향을 미쳤습니다 QuantumCircuit.mcrx(), :meth:.QuantumCircuit.mcry 및 QuantumCircuit.mcrz()뿐만 아니라 RXGate.control(), RYGate.control()또는 RZGate.control() 회전 각도가 ParameterExpression. 이제 이러한 다중 제어 회전 회로를 오류 발생 없이 합성할 수 있습니다.

  • QPY의 버그 수정(qiskit.qpy)에서 클래스 게이트가 포함된 회로가 MCMTGate 클래스의 게이트를 포함하는 회로가 직렬화되지 않던 버그를 수정했습니다. 13965번을 참조하세요.

  • 상태 벡터가 정규화되지 않은 경우 Statevector.expectation_value() 가 상태 벡터가 정규화되지 않은 경우 ID 연산자에 대해 잘못된 결과를 생성하는 버그를 수정했습니다. Fixed #13029

  • 양자 회로를 게이트로 변환할 때 converters.circuit_to_instruction() 를 사용하여 양자 회로를 게이트로 변환하면 이제 제어 흐름 명령어가 포함된 회로에서 제대로 실패합니다.

  • 전화하기 AnalysisPass 또는 TransformationPass 함수를 호출하면(예: pass_ = MyPass(); pass_(qc)) 이제 패스의 모든 요구 사항을 준수합니다. 예를 들어 다음과 같은 패스를 예약하려면 ALAPScheduleAnalysis 와 같은 패스를 예약하려면 TimeUnitConversion 가 먼저 실행되도록 합니다. 를 사용하여 패스를 실행하면 PassManager 는 항상 이 요구 사항을 존중했지만, 지금까지는 패스를 직접 호출할 때는 이 요구 사항이 존중되지 않았습니다.

  • 호출 내부에서 TranspilerError 서브클래스가 PassManger.run() 로의 호출 내부에서 패스로 발생하면 이제 예외가 지워진 유형으로 체인화된 예외가 되는 대신 무손실 방식으로 전파됩니다.

  • SabreSwap 는 라우팅 중에 제어 흐름 블록에서 유휴 큐비트 와이어를 더 이상 수축시키지 않습니다. 이는 일반적으로 유효한 최적화이지만 라우팅 패스의 예상되는 부작용은 아닙니다. 이제 ContractIdleWiresInControlFlow 패스를 사용하여 이 수축을 수행할 수 있습니다.

  • SparsePauliOp.to_matrix 에서 프로세스별 비결정성을 수정했습니다. 합계에서 부동 소수점 연산의 정확한 순서는 이전에는 프로세스마다 달랐지만 이제 동일한 스크립트의 여러 호출 간에 동일하게 적용됩니다. 13413번을 참조하세요.

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