Skip to main content
IBM Quantum Platform

Qiskit SDK 2.3 릴리스 노트


2.3.1

Prelude

Qiskit v2.3.1 은 Qiskit v2.3.0 출시 이후 발견된 여러 버그를 수정합니다.

버그 수정

  • 이제 의 내장 permutation.kms 합성 플러그인이 길이가 qiskit.synthesis 0인 순열을 올바르게 처리합니다. #15550을 수정했습니다.

  • 단일 큐비트 클리포드 연산에 대해 synth_clifford_depth_lnn() 수정됨. #15780을 참조하십시오.

  • 연산 재귀적 합성 후 큐비트 상태가 올바르게 업데이트되지 않던 트랜스파일러 HighLevelSynthesis 단계의 버그를 수정했습니다. 경우에 따라 이로 인해 패스에서 잘못된 회로가 생성될 수 있습니다.

  • 함수 qs_decomposition() 내부의 선형 대수 루틴에서 발생할 수 있는 오차 허용 범위 문제로 인해 패닉이 발생하여 프로그램이 중단되던 문제를 수정했습니다. 이 문제가 수정되어, 이제 이러한 상황에서는 적절한 QiskitError 예외나 하위 클래스가 발생합니다.

    #15610을 수정했습니다.

  • 2개 이상의 큐비트가 포함된 게이트에 대해 access UnitaryGate.control() UnitaryGate.definitioncallUnitaryGate 호출할 때의 기본 합성 방식은 내부적으로 qs_decomposition() function 을 활용합니다. 반복적 퀀텀 섀넌 분해(Quantum Shannon Decomposition) 과정에서 수행되는 선형 대수 연산에 내재된 부동소수점 오차 허용 범위 때문에, 경우에 따라 계산이 항상 성공하지 않을 수 있습니다. 이러한 속성이나 메서드가 오류가 발생하는 것을 방지하기 위해, 이러한 상황에서는 대신 에서의 분해 방식을 Isometry 사용합니다. 비록 이로 인해 분해 효율이 떨어지기는 하지만, qs_decomposition() 가 실패할 qs_decomposition() 경우 대체 방안으로 작동할 것입니다.

  • 비대칭 산술 연산(예: ** 또는 -)에서 ParameterExpression.sympify() , ParameterExpression 및 숫자 값의 특정 조합에 따라 피연산자의 순서가 Parameter뒤바뀔 수 있는 버그를 수정했습니다. #15642를 참조하십시오.

  • 신원 관측 가능 항에 접근할 때 발생하는 문제를 qk_obs_term() 수정했습니다. #15536을 참조하십시오.

  • 부동 소수점 노이즈로 인해 대칭 얽힘 상태(벨 상태 등)가 임의로 회전되는 plot_state_qsphere() 시각화 오류를 수정했습니다.

  • 매개변수화 게이트를 사용하는 회로에 대해 QuantumCircuit.repeat() 수정되었습니다.

    #15645를 참조하십시오.

  • ‘ancilla’라는 사용자 정의 레지스터가 존재할 때, QuantumCircuit.ensure_physical() 를 사용하여 생성된 회로에서 가 qpy.load() 충돌하는 버그를 수정했습니다.

  • 특정 트랜스파일러 단계에서 및 ContinueLoopOp 가 제어 흐름 연산으로 잘못 BreakLoopOp 인식되는 문제를 수정했습니다. 이로 인해 예외가 AttributeError 발생할 수 있었습니다. #15579를 참조하십시오.

  • ‘ancilla’라는 사용자 정의 레지스터가 존재할 때, 를 SabreLayout 사용하여 생성된 회로에서 가 qpy.load() 충돌하는 버그를 수정했습니다.

  • NumPy 의 최소 요구 버전이 이제 1.21 (기존의 1.17 대신)로 올바르게 표시됩니다. 이 제한 사항은 NumPy 1.21 에서 도입된 의 numpy.typing.NDArray 사용으로 인해 지난 몇 차례의 릴리스 동안 사실상 적용되어 왔으므로, 구버전의 NumPy 에서는 Qiskit을 불러오는 데 실패할 것입니다.

  • OpenQASM 의 3번 익스포터(qasm3.dumps()dump())는 이제 식별자 내에서 사용될 때 ASCII 숫자 이외의 유니코드 “숫자” 문자를 올바르게 이스케이프 처리합니다. 이전에는 위첨자 같은 문자가 출력 결과에 그대로 남아 있었는데, 이는 OpenQASM 3에서는 유효하지 않습니다.

  • OpenQASM 의 3번 익스포터(qasm3.dumps()dump())는 이제 이름이 ASCII 숫자로 시작하는 식별자를 올바르게 이스케이프 처리합니다.

  • 이제 SparsePauliOp.from_sparse_list()SparsePauliOp.from_list() 함수는 인수가 dtype 지정되지 않은 경우 계수의 데이터형을 자동으로 추론합니다.

    예를 들어,

    from qiskit.quantum_info import SparsePauliOp
    from qiskit.circuit import Parameter
    
    theta = Parameter("theta")
    
    # Previously required manually setting dtype=object
    op_list = SparsePauliOp.from_list([("X", theta)])
    op_sparse = SparsePauliOp.from_sparse_list([("X", [0], theta)], num_qubits=1)

2.3.0

Prelude

Qiskit v2.3.0 는 퀀텀 컴퓨팅 연구소( Qiskit SDK )의 새로운 기능 릴리스입니다.

이 새로운 버전은 트랜스파일링을 위한 C API를 대폭 확장하여, C 환경에서 (QkTarget) Target 의 더 많은 부분을 검사할 수 있게 하고, (QkDag) DAGCircuit 를 생성 및 조작할 수 있도록 합니다. 이를 통해 독립형 libqiskit 객체를 대상으로 컴파일할 때 사용자 정의 트랜스파일러 패스를 작성할 수 있습니다. C API에는 개별 트랜스파일링 단계 함수(예: qk_transpile_stage_layout())가 제공되어, 전체 파이프라인을 수동으로 다시 만들 필요 없이 트랜스파일링 과정에 사용자 정의 로직을 쉽게 삽입할 수 있습니다.

초기 내결함성 대상 플랫폼으로의 트랜스파일링 성능과 기능 세트도 개선되었습니다. 파울리 곱 기저로 투영하는 새로운 PauliProductMeasurement 명령어를 통해, Qiskit은 이제 기존 LitinskiTransformation 패스를 사용하여 회로를 파울리 기반 계산 기저로 트랜스파일링하는 기능을 완벽하게 지원합니다. 트랜스파일러에서 를 unitary_synthesis_method="gridsynth"사용하여 설정할 수 있는 새로운 단일 합성 방법은 RossSelingerSynthesis, 단일 큐비트 클리포드+T 합성에 대해 점근적으로 최적의 로스-셀링거 알고리즘을 사용할 수 있게 해줍니다. 그 밖의 개선 사항으로는, 예를 들어, 파울리 기반 회로의 교환법칙 최적화를 고려한 더 나은 OptimizeCliffordT 패스나 해당 CommutativeOptimization 패스 등이 있습니다.

내부적으로 객체의 ControlFlowOp 표현 방식이 Rust 네이티브 방식으로 변경되었습니다. 이 전환 작업은 아직 완료되지 않았습니다. Qiskit( 2.3 )에서 제어 흐름 연산과 관련된 부분에서 성능 저하가 발생할 수 있습니다. 향후 Qiskit 버전에서는 제어 흐름 연산과 관련된 오랜 기간 제기되어 온 성능 및 API 문제를 해결함으로써 이 부분을 한층 더 발전시킬 것으로 기대됩니다.

본 릴리스부터는 Python 3.9 가 2025년 10월로 지원 종료 예정이므로 더 이상 지원되지 않으며, macOS 의 Intel 프로세서 지원은 Apple이 해당 플랫폼 지원을 단계적으로 중단함에 따라 2단계 플랫폼 지원으로 하향 조정되었음을 유의하시기 바랍니다. 3.10 부터의 모든 CPython 버전이 지원됩니다. 현재 지원되는 다양한 플랫폼의 지원 단계는 운영 체제 지원 페이지를 참조하십시오.

2.x 시리즈의 Qiskit 기능 업데이트가 추가로 제공될 예정입니다. 현재 호환성 깨는 변경 사항이 필요하지 않으므로, Qiskit 3.0 은 2026년 후반이 되어야 출시될 것으로 예상됩니다.

C API 기능

회로 기능

  • 여러 큐비트에 대한 공동 투영 측정을 나타내는 새로운 명령 클래스 PauliProductMeasurement 를 추가했습니다. 여기서 측정되는 관측량은 파울리 연산자의 텐서곱입니다. 이 측정의 결과는 +1+1 또는 1-1 중 하나의 고유값이며, 이는 파울리 곱의 고유상태를 나타냅니다.

    추가 배경 정보는 Daniel Litinski의 "표면 코드의 게임: 격자 수술을 통한 대규모 양자 컴퓨팅 "을 참조하십시오.

    A는 에서 PauliProductMeasurement 인스턴스화될 수 있으며 Pauli, 이때 파울리 벡터는 1-1 위상은 포함할 수 있으나, ii 또는 i-i 위상은 포함할 수 없다. 이 명령어는 파울리 벡터와 동일한 수의 큐비트를 가지며, 하나의 고전적 비트를 포함한다.

    에를 들면 다음과 같습니다.

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import Pauli
    from qiskit.circuit.library import PauliProductMeasurement
    
    ppm = PauliProductMeasurement(Pauli("XZ"))
    
    qc = QuantumCircuit(6, 2)
    qc.append(ppm, [4, 1], [1])
  • 이제 새로운 QuantumCircuit.to_dag() 방법이 를 편리하게 감싸주는 circuit_to_dag()기능을 제공합니다.

  • ParameterExpression 이제 속성을 갖게 되었는데 num_parameters , 이 속성은 해당 parameters 집합의 길이와 같지만 계산에 드는 부하가 더 적습니다.

OpenQASM 기능

  • OpenQASM 2 익스포터(qasm2.dumps())는 조건이 단순한 레지스터-정수 비교 연산인 경우, 간단한 단일 명령어 IfElseOp 블록을 출력할 수 있게 되었습니다. 이는 OpenQASM 2 언어가 표현할 수 있는 범위에 해당합니다.

QPY 기능

  • QPY 버전 17부터는 객체의 매개변수로 사용될 때 해당 객체에 SparseObservable 대한 직렬화 형식이 포함됩니다. 특히, 이를 통해 내부적으로 이 연산자를 사용하는 객체를 PauliEvolutionGate 직렬화할 수 있으며, 에볼루션 게이트의 페이로드가 업데이트됩니다.

양자 정보 특성

  • 의 미러 사이트로 Statevector.from_circuit()Operator.from_circuit() 추가되었습니다. 이를 통해 물리적 큐비트 공간으로 변환된 회로의 경우에도 가상 큐비트 공간에서 직접 Statevector 인스턴스를 생성할 수 있습니다.

  • 클리포드 게이트만 포함된 및 QuantumCircuitfront=True 인수로 받아 Clifford.dot() 호출될 때 Clifford.compose() , 및 의 성능을 개선했습니다. 이전에는 먼저 회로가 객체로 Clifford 완전히 변환된 다음, 두 객체가 결합되었습니다. 이제 베이스는 반복적으로 Clifford 업데이트되는데, 이는 소규모 회로의 경우 처리 속도가 훨씬 빠릅니다.

  • 메서드를 PauliLindbladMap.parity_sample() 추가했습니다. 이 방법은 기존의 PauliLindbladMap.signed_sample() 방법과 매우 유사하지만, Qiskit의 다른 부분들과 더 일관된 부호 규칙을 사용하므로, 앞으로는 이 방법을 사용하는 것이 권장됩니다. 인스턴스를 수정하지 않고 샘플링할 때 비율에 스케일링을 적용하기 위한 추가적인 선택적 인수가 있습니다.

  • , is_identity_matrix() 와 같은 여러 “예언자” quantum_info 함수들은 불필요한 행렬 할당을 방지하기 위해 최적화되었습니다.

합성 기능

  • 지정된 각도의 RZ 회전을 근사하는 단일 큐비트 양자 회로를 구성하는 함수를 추가했습니다 gridsynth_rz(). 이 알고리즘은 Neil J. Ross와 Peter Selinger가 저술한 논문 『Optimal ancilla-free Clifford+T approximation of z-rotations 』에 설명되어 있으며, https://github.com/qiskit-community/rsgridsynth 에서 구현되어 있습니다.

  • 주어진 단일 큐비트 유니터리 행렬을 근사하는 단일 큐비트 양자 회로를 구성하는 함수를 추가했습니다 gridsynth_unitary(). 이 알고리즘은 유니터리 행렬을 RZ 회전, RX 회전, 그리고 또 다른 RZ 회전으로 분해한 다음, 이 세 가지 회전 각각에 로스-셀링거 알고리즘을 적용하는 방식으로 작동합니다.

  • 일반적인 단일 합성 알고리즘이 qs_decomposition() Rust로 재작성되어 함수의 실행 속도가 크게 향상되었습니다.

트랜스파일러 기능

  • 교환 법칙을 활용하여 게이트 취소 및 병합을 수행하는 새로운 트랜스파일러 CommutativeOptimization패스를 추가했습니다. 이 패스는 과 CommutativeCancellation 의 기능을 CommutativeInverseCancellation통합하고 확장합니다.

    구체적으로, 패스:

    • 역상 게이트 쌍을 취소하며, 여기에는 전역 위상까지 역상인 쌍도 포함됩니다(필요한 경우 전역 위상을 조정함).
    • 가능한 경우 연속된 게이트를 병합하려고 시도합니다. 예를 들어 RZ-게이트, RX-게이트, 파울리 회전 등의 시퀀스입니다.
  • 트랜스파일러 UnitarySynthesis 패스에 새로운 옵션인 를 fallback_on_default 추가했습니다. 이 옵션은. method인수를 통해 지정된 기본값이 아닌 합성 플러그인을 사용하여 패스가 호출될 때 적용됩니다.

    기본적으로, 지정된 플러그인은 회로 내의 모든 유니터리를 합성하는 데 사용됩니다(단, 해당 플러그인이 적용 가능한 경우에 한함. 예를 들어, 유니터리가 정의된 큐비트 수를 지원하지 않는다면 실행되지 않습니다). 플러그인이 유니터리를 합성할 수 없어 를 반환하는 경우 None, 회로 내의 원래 유니터리는 변경되지 않은 상태로 유지됩니다. 가 로 fallback_on_default 설정되어 True 있으면, 지정된 메서드가 실패할 때 대신 플러그인이 DefaultUnitarySynthesis 호출됩니다.

    이 기능은 사용자 정의 플러그인이 모든 유니터리의 일부만 처리하도록 설계된 경우에 특히 유용합니다: 사용자는 해당되는 경우 사용자 정의 로직을 활용하고, 그렇지 않은 경우에는 기본 합성 방식을 사용할 수 있습니다.

  • Ross-Selinger 알고리즘을 사용하여 단일 큐비트 유니타리 게이트를 합성하고, 클리포드(Clifford), 켈리( TT ), 켈리-켈리( TT^\daggerRossSelingerSynthesis) 게이트로 구성된 단일 큐비트 양자 회로를 생성하는 새로운 유니타리 합성 플러그인을 추가했습니다.

    이 플러그인은 매개변수가 로 method 설정되었을 때 트랜스파일러 UnitarySynthesis"gridsynth" 패스에 의해 호출됩니다.

  • Clifford+T 기저로 변환할 때, 트랜스파일러 UnitarySynthesis 패스는 이제 기본적으로 Clifford+T 합성 알고리즘을 사용하여 단일 큐비트 유니터리를 근사화합니다.

    마찬가지로, 이 DefaultUnitarySynthesis 플러그인은 이제 단일 큐비트 유니터리를 근사화하기 위해 동일한 Clifford+T 합성 알고리즘을 사용합니다.

  • 이제 새로운 DAGCircuit.to_circuit() 방법이 를 편리하게 감싸주는 dag_to_circuit()기능을 제공합니다.

  • 각도가 π/4\pi/4 의 정수 배인 단일 큐비트 회전 RXGate 게이트와 RYGate 회전 RZGate게이트를 클리포드 게이트, 게이트 TGateTdgGate 게이트의 이산 집합으로 변환하는 새로운 트랜스파일러 패스를 추가했습니다 SubstitutePi4Rotations. π/4\pi/4 의 홀수 배수는 단일 TGateTdgGate게이트와 일부 클리포드 게이트가 필요한 반면, π/4\pi/4 의 짝수 배수, 즉 π/2\pi/2 의 정수 배수는 클리포드 게이트만으로 표현할 수 있다는 점에 유의하십시오.

  • 트랜스파일러 패스가 측정값을 처리할 LitinskiTransformation 수 있도록 확장되었습니다. 따라서 이 변환은 이제 클리포드 게이트, 단일 큐비트 RZ 회전 게이트( TTTT^\dagger 포함), 그리고 표준 Z 측정으로 구성된 회로에 적용되며, 클리포드 게이트를 회로의 맨 끝으로 이동시킵니다. 이 과정에서 RZ 회전을 파울리 회전의 곱( PauliEvolutionGate 게이트로 구현됨)으로 변환하고, Z 측정을 파울리 측정의 곱(명령어를 PauliProductMeasurement 사용하여 구현됨)으로 변환합니다.

  • 트랜스파일러 OptimizeCliffordT 최적화 단계가 대폭 개선되어 Rust로 재구현되었습니다.

    이 패스는 Clifford+T 게이트셋으로 표현된 회로에 대해 피홀 최적화를 수행합니다. 더 정확히 말하면, 클리포드+T를 포함하는 모든 단일 큐비트 게이트 체인을 최소한의 퀀텀 비트 연산( TT ) 또는 퀀텀 비트 연산( TT^\dagger ) 사용으로 압축합니다. 이 패스는 체인 내 게이트 수에 비례하는 시간 내에 실행됩니다.

  • . WrapAngles에 대한 기본 레지스트리를 포함하여 WrapAngles.DEFAULT_REGISTRY 추가되었습니다. 이 새로운 속성은 기존의 속성을 WRAP_ANGLE_REGISTRY대체하며, 하위 사용자들은 가능한 한 빨리 새로운 형식으로 변경할 것을 권장합니다.

  • 이제 및 DAGCircuit.topological_nodes() DAGCircuit.topological_op_nodes() 메서드는 부울형 reverse 인수를 지원합니다. 이 옵션으로 True설정하면, 해당 메서드는 회로의 출력단에서 입력단으로 향하는 역 토폴로지 순서대로 노드를 반환합니다. 이는 함수에서 반환된 노드 목록을 명시적으로 역순으로 바꾸거나, 구조적으로 역순인 새로운 DAGCircuit.reverse_ops() DAG를 생성하는 등의 부하 없이 DAG를 역순으로 순회할 수 있는 직접적이고 효율적인 방법을 제공합니다.

  • 이제 생성 파울리 연산자들이 교환되는지 확인함으로써, 파울리 CommutationChecker 기반 PauliProductMeasurement 게이트 PauliGate, PauliEvolutionGate 및 간의 효율적인 교환성 검사를 지원합니다. 이를 통해, 특히 파울리 진화(Pauli evolutions)와 파울리 곱 측정(Pauli product measurements)으로 표현되는 파울리 기반 계산 형식의 회로에 대한 최적화가 가능해집니다. 다만, 이러한 파울리 기반 게이트와 다른 표준 게이트 간의 교환 연산은 아직 동일한 수준의 효율성으로 처리되지 않는다는 점에 유의하십시오.

  • 에 새로운 인자, matrix_max_num_qubits CommutationChecker.commute()를 추가했습니다. 이를 통해, 교환 검사기가 지수적으로 계산 비용이 많이 드는 행렬 표현을 계산할 수 있도록 허용되는 명령어의 크기를 제한할 수 있습니다. 이 새로운 인수를 사용하면 처리할 수 있는 명령어의 크기 제한(기본값이 None 새로 설정된 로 max_num_qubits , 즉 제한이 없음)과 행렬 크기 제한을 구분할 수 있습니다.

  • 이제 함수 generate_preset_pass_manager()transpile() 와 는 Clifford+T 기저 집합으로 컴파일할 때 인자 를 unitary_synthesis_method 고려하므로, 사용자 정의 유니터리 합성 플러그인을 호출할 수 있게 되었습니다.

  • VF2Layout 그리고 VF2PostLayout 이제 부분 후보 레이아웃 점수를 서브그래프 동형 매칭 과정에서 추적합니다. 찾을 수 있는 완벽한 레이아웃이 없을 때는 이 방법이 별다른 효과를 내지 못하지만, 대칭성이 높은 경우 레이아웃을 평가하여 최적의 후보를 선정하는 데 드는 비용을 획기적으로 줄일 수 있습니다.

  • 이제 와 VF2Layout 의 인수는 call_limit VF2PostLayout 2-튜플이 될 수 있으며, 첫 번째 항목은 첫 번째 일치 항목이 발견되기 전에 사용되고, 그 후에는 처리 범위가 두 번째 항목으로 전환됩니다. 레이아웃이 더 적극적인 정리(pruning)를 통해 실시간으로 점수화되므로, 이는 max_trials 인수보다 더 신뢰할 수 있는 실행 시간 제한기입니다.

기타 기능

업그레이드 주의사항

  • ConsolidateBlocks 이제 진입 시 ConsolidateBlocks_qubit_map 키를 PropertySet 읽습니다. 이 키와 해당 값은 공개되지 않으며, 다른 패스가 이를 읽거나 쓰지 않아야 합니다.

C API 업그레이드 노트

  • qk_target_entry_new_fixed() 대상 항목의 이름을 설정하기 위한 추가 name 매개변수가 있습니다. 고정 각도 입력은 거의 예외 없이 정상적으로 작동하기 위해 표준 게이트의 이름을 재정의해야 합니다.

회로 업그레이드 노트

  • 표준 회로 라이브러리 게이트의 정의로 생성된 회로 이름은 이제 로 설정됩니다 None. 이전에는 이러한 회로들이 게이트와 동일한 이름을 가졌기 때문에, 표준 게이트와 이름이 일치하는 불투명 게이트를 매우 쉽게 구성할 수 있었다. 이는 Qiskit에서 표준 게이트 이름은 고유해야 한다는 일반적인 가정을 위반합니다.

  • s가 a QuantumCircuit 또는 b에 ControlFlowOp 추가되면 s의 내부 DAGCircuit 표현이 변경됩니다. 서킷에 저장된 객체는 나중에 다시 액세스할 때 반환되는 객체가 반드시 서킷에 추가된 것과 동일한 인스턴스일 필요는 없습니다. 사용자는 체가 회로에 추가된 후에는 해당 객체를 그 자리에서 수정하려고 시도해서는 안 됩니다. 이는 제어 흐름이든 다른 객체이든 상관없이 회로에 손상을 줄 가능성이 높습니다.

    Python QuantumCircuit 객체에 대한 모든 DAGCircuit인플레이스 변형과 마찬가지로, Rust가 해당 변경 사항을 반영할 수 있도록 해당 명령어를 회로에 다시 할당해야 합니다. 예를 들어, 이미 회로에 존재하는 BoxOp 객체에 주석을 추가할 때, 트랜스파일러 패스는 Rust-space 객체를 업데이트하기 위해 반드시 DAGCircuit.substitute_node() 를 사용해야 합니다:

    from qiskit.circuit import QuantumCircuit, Annotation
    
    class MyAnnotation(Annotation):
        namespace = "my"
    
    qc = QuantumCircuit(2)
    with qc.box():
        qc.cx(0, 1)
    dag = qc.to_dag()
    
    # Modifications to the box's annotations in-place require
    # writing back the information to Rust space.
    box_node = next(dag.topological_op_nodes())
    box_node.op.annotations.append(MyAnnotation())
    
    # Write back the operation.
    dag.substitute_node(box_node, box_node.op)
  • Qiskit 2.3 에서는 제어 흐름의 내부 표현 방식을 기존의 Python 중심 방식에서 Rust 네이티브 방식으로 전환하는 과정에서, jumpBoxOp 포함한 명령어가 ControlFlowOp 포함된 경우 트랜스파일러의 성능이 일시적으로 저하될 것으로 예상됩니다. 향후 Qiskit 버전에서 성능이 다시 개선될 것으로 기대하며, 이를 통해 제어 흐름 연산에 적용되는 트랜스파일러 패스에서 오랫동안 존재해 온 API의 미비점을 해결할 수 있을 것으로 보입니다.

  • 인스턴스 ControlFlowOp 블록은 더 이상 또는 metadata 필드를 name 추적하지 않습니다. 이 기능들은 이미 제어 흐름 빌더 인터페이스를 통해 설정할 수 없었으며, 그 존재는 의도된 API라기보다는 의도치 않은 구현 세부 사항에 불과했습니다.

  • 인수가 로 annotated 설정되어 True 있고 네이티브 제어 게이트 클래스를 사용할 수 있는 경우, 이 메서드는 Gate.control()AnnotatedOperation 더 이상 를 반환하지 않습니다. 이 변경 사항은 표준 회로 라이브러리 전반에서 해당 인수가 annotated 사용되는 방식과 일관되며, 제어 주석이 달린 게이트를 보다 효율적으로 분해할 수 있게 해줍니다. 영향을 받는 게이트는 다음과 같습니다:

    • 단일 제어 H, S, Sdg, U3 Y, Z, SX,, RX, RY, RZ, SwapCZ 게이트;
    • 이중 제어 Z게이트;
    • 임의로 제어되는 Phase, CPhase, MCPhase, U1, CU1, MCU1MCMT 게이트.
  • 이제 의 인수의 annotated``None 기본값은 QuantumCircuit.control() 에서 로 False변경되었습니다. 이는 실제 회로에는 영향을 미치지 않지만, 회로 라이브러리 전반에 걸쳐 사용되는 annotated 기본값과 일치합니다.

QPY 업그레이드 노트

  • 에서 사용되는 기본 qpy.dump() QPY 버전 (QPY_VERSION)은 이제 17입니다.

양자 정보 업그레이드 노트

  • 큐비트 수에 따라 성능이 급격히 저하되던 전용 단축 경로 대신, 최적화된 일반 사례 구현 방식을 Statevector.expectation_value() 활용하여 모든 정체 파울리 연산자의 성능을 개선했습니다.

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

  • 대칭성이 매우 높은 시험 회로가 대규모 결합 맵으로 매핑될 경우 과도한 실행 시간을 방지하기 위해, 에서의 VF2PostLayout 정확한 일치 실행에 대한 최대 optimization_level=3 호출 및 시험 횟수 제한이 축소되었습니다.

  • 트랜스파일러 WrapAngles 패스의 기본 레지스트리 위치는 이제 입니다 WrapAngles.DEFAULT_REGISTRY. 이전 방식의 깊게 중첩된 WRAP_ANGLE_REGISTRY 경로는 하위 호환성을 위해 계속 사용할 수 있지만, 하위 패키지에서는 새로운 위치를 사용할 것을 권장합니다. 이전 경로는 Qiskit 2.2 의 실수로 인해, 공개 API의 일부로 의도되지 않았던 모듈들을 탐색하게 됩니다.

  • 와 에 VF2Layout 대한 인터페이스는 VF2PostLayout 논리적으로는 동일하게 유지되지만, 인수는 max_trials 이제 값으로 설정된 경우를 제외하고는 런타임 1제한기로서의 효과가 훨씬 줄어들었습니다. 이는 해당 클래스가 내부적으로 사용하는 새로운 온더플라이 점수-정제 알고리즘 덕분에 “완전한” 레이아웃이 훨씬 드물게 발견되며, 오류율이 이전 레이아웃보다 더 낮은 새로운 레이아웃이 발견될 때만 “시도” 횟수가 증가하기 때문입니다. 대신 를 결정론적 런타임 call_limit 제한기로 사용해야 합니다. 여기서 는 발생한 전체 max_trials 레이아웃을 측정하고, 는 부분 call_limit 레이아웃 확장을 측정합니다.

기타 업그레이드 관련 사항

  • Python 의 최소 지원 버전이 이제 3.10 로 변경되었습니다. 이는 Python 의 지원 종료( 3.9, 2025년 10월) 및 Qiskit에서 2.1 버전부터 제공된 비추천 경고에 따른 조치입니다.

  • macOSx86-64 (Intel)에 대한 지원 등급이 1단계에서 2단계로 하향 조정되었습니다. Qiskit은 이 플랫폼을 위해 검증되고 사전 컴파일된 휠을 계속 제공할 예정이지만, 테스트는 변경 사항 발생 시마다 수행되지 않고 출시 시점에만 수행됩니다. 이로 인해 해당 플랫폼용 휠 출시가 지연될 수 있습니다.

    이 변경은 Apple이 해당 플랫폼의 지원을 중단하기 시작했으며, Qiskit 팀이 1단계 지원을 지속할 개발자나 CI 자원이 남아 있지 않기 때문에 이루어졌습니다. macOSx86-64 에 대한 지원은 GitHub 에서 계속해서 실행기를 제공하는 동안에만 가능하며, 이 지원은 2027년 하반기에 종료될 예정입니다.

C API 사용 중단

  • 이 함수는 더 이상 qk_transpiler_pass_standalone_vf2_layout() 사용되지 않으므로, 호출자는 이제 qk_transpiler_pass_standalone_vf2_layout_average() 를 사용해야 합니다. 새로운 함수 이름은 점수 산정 규칙을 더 명확하게 설명해 주며, 이 API를 통해 두 가지 제한 조건이 포함된 형태를 포함하여 전체 새로운 구성 객체에 call_limit 대한 캡슐화된 접근이 가능합니다.

    이 기능 폐지는 사용자에게 완전히 필수적인 것은 아니지만, C API가 여전히 명시적으로 불안정한 상태이므로, 안정성 보장을 달성하기 전에 C API 내 기능 폐지 및 컴파일러별 경고 관리를 시험적으로 적용하는 목적으로 활용하고 있습니다.

회로 사용 중단

  • Qiskit 1.0 버전부터, 메서드 Gate.control() 와 는, True 또는 QuantumCircuit.control()False 중 하나를 annotated 인수로 None 받을 수 있습니다. 현재, 제어 게이트가 존재할 경우 그 값과 관계없이 전용 제어 게이트 annotated클래스를 사용하여 표현됩니다. 예를 들어, 의 2-제어 XGate 버전은 입니다 CCXGate. 전용 제어 게이트 클래스가 존재하지 않는 경우, 제어 게이트는 일 ControlledGate 때는 annotated=False 로, 일 AnnotatedOperation 때는 로 annotated=True표현됩니다. 기본값은 와 완전히 annotated=None 동일하게 False 처리됩니다.

    Qiskit 3.0 에서는 더 이상 설정을 허용하지 annotated=None 않으며, 대신 annotated=True기본값을 로 변경합니다. 이 방법은 권장됩니다. 제어 회로의 생성을 회로 생성 단계에서 트랜스파일러 단계로 연기하고, 추가적인 제어 게이트 최적화를 가능하게 하여 일반적으로 더 높은 품질의 회로(특히 계층적 회로의 경우)를 생성하기 때문입니다.

    그러나 이전 동작을 유지하도록 명시적으로 annotated=False 설정할 수 있습니다.

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

빌드 시스템 변경 사항

  • 소스에서 Qiskit을 빌드하거나 패키징할 때 필요한 setuptools 버전은 이제 최소 77.0 버전(2025년 3월 출시) 이상이어야 합니다. 이는 PEP 639의 새로운 라이선스 메타데이터 사양을 지원하기 위한 것입니다. 이 종속성은 빌드 요구사항에 명시되어 있으므로 수동 작업이 필요하지 않습니다.

버그 수정

  • 회로 매개변수를 심층 복사하지 않았던 QuantumCircuit 내의 __deepcopy__() 구현을 수정했습니다. 결과적으로, 복제된 회로에서 BoxOp 를 변경하더라도 원래 회로에는 더 이상 영향을 미치지 않습니다.

  • DAGCircuit.apply_operation_back(), apply_operation_back() 그리고 이제 새로운 에지를 circuit_to_dag() 결정론적인 순서로 추가할 것입니다. 이러한 동작으로 인해 특정 트랜스파일러 단계(예: SabreSwap)가 DAG를 비결정적인 순서로 탐색하게 될 수 있습니다.

  • DAGCircuit.apply_operation_front() 이제 클래식 조건이 포함된 노드를 처리할 때 유효하지 않은 자기 참조 루프를 삽입할 수 없습니다.

  • 고정 각도 매개변수를 가진 1q 게이트가 포함된 Target 로 패스가 초기화될 때 Optimize1qGatesDecomposition 발생하는 문제를 수정했습니다. 이전에는 대상 게이트가 임의의 매개변수 값을 지원하는지 확인하지 않았기 때문에, 해당 패스가 대상 외부에 게이트를 출력할 가능성이 있었습니다. #14743을 수정했습니다.

  • 블록 내의 다중 큐비트 게이트가 소스 회로의 ControlFlowOp 절대 인덱스를 사용하는 대신 해당 BasisTranslator 블록의 로컬 큐비트 인덱스를 따라가던 오류를 수정했습니다.

  • 하나 이상의 회로를 transpile() 사용하는 호출 및 프로세스 기반 병렬화가 없는 경우를 포함하여, 여러 회로에서 동일한 ConsolidateBlocks 인스턴스가 재사용되는 문제를 수정했습니다. Qiskit 2.2.2 에 도입된 버그로 인해, 서로 다른 회로에서 동일한 인스턴스를 재사용할 경우 패스가 패닉 상태에 빠지거나 잘못된 출력을 생성하는 문제가 발생했습니다.

  • 이제 트랜스파일러 ConsolidateBlocks 패스는 제어 흐름 연산을 재귀적으로 처리하는 과정에서 주어진 게이트가 하드웨어에서 지원되는지 여부를 올바르게 판단합니다.

  • qpy.dump() 이제 QPY 버전 16 이상에서 표준 라이브러리 gzip 모듈을 사용하여 열린 파일에 .gz 데이터를 기록할 수 있습니다. 자세한 내용은 #15157을 참조하십시오.

  • 역함수를 계산할 때 개방 제어 게이트의 제어 상태를 유지하도록 MCU1Gate.inverse()MCPhaseGate.inverse() 메서드를 수정했습니다.

  • ConsolidateBlocks 이제 레거시 run_list or PropertySet block_list 키에서 유효하지 않거나 오래된 분석 정보를 감지할 경우, 패닉을 일으키는 대신 Python -space 예외를 반환합니다.

  • Optimize1qGatesDecomposition 이제 보다 크거나 보다 큰 회로에서 Target실행을 시도할 경우, Rust의 스페이스 패닉 대신 TranspilerError 이 발생합니다.

  • pickle pickle SabreSwap SabreSwap.run() 메서드가 실행된 후 SabreSwap instance 를 pickle 로 변환할 때 오류가 발생하던 문제를 수정했습니다. #15071을 수정했습니다.

  • 스케줄링 패스인 ALAPScheduleAnalysisASAPScheduleAnalysis는 이제 연산이 없는 회로를 올바르게 처리하게 됩니다. 이전에는 “기간이 지정되지 않았습니다”라는 잘못된 오류 TranspilerError 메시지를 표시하곤 했습니다. #15145을 수정했습니다.

  • 연산자가 단위원인지 확인할 때 입력 허용 오차 값이 제대로 반영되지 is_unitary() 않던 문제를 수정했습니다. 이제 이 메서드는 연산자를 단순화하고 그것이 항등식과 같은지 확인할 때, 제공된 atolrtol 매개변수를 올바르게 사용합니다. 이 업데이트로 #14107이 수정되었습니다.

  • transpiler UnitarySynthesis 패스에서, 를 basis_gates 지원하지만 는 지원하지 않는 비기본 합성 플러그인(을 target통해 method지정됨)으로 호출될 때 발생하는 버그를 수정했습니다. 이제 이 패스는 기본 게이트를 에서 target 플러그인으로 올바르게 전달합니다.

  • 제어 흐름 연산 내부의 회로 블록이 외부 회로와 다른 레지스터에 정의되었을 때 발생할 수 있었던 회로 텍스트 드로어의 오류를 수정했습니다. 이러한 상황은 예를 들어 연산을 직접 ControlFlowOp 추가할 때나, 트랜스파일링 후의 회로에서 발생할 수 있습니다.

  • QPY 버전 17을 사용할 때 형식의 연산자를 사용한 PauliEvolutionGate 직렬화 SparseObservable지원 문제를 수정했습니다.

  • 에 저장된 QkTargetOp 배열의 길이가 QkTargetOp.params 에서 반환된 값과 일치하지 않는 QkTargetOp.num_params문제를 수정했습니다. 와일드카드 매개변수는 이제 로 NAN표시되며, 배열의 길이는 항상 입니다 QkTargetOp.num_params. 이 버그는 2.3.0rc1 버전에서만 발생했습니다.

  • 폭이 64비트보다 Uint 큰 형식의 Value 클래식 표현 방식에서 발생한 회귀 현상을 수정했습니다. 이전에는 이러한 유형을 가진 표현식의 값이 내부적으로 의도치 않게 double 부동 소수점 값으로 강제 변환되어 정밀도가 저하되는 문제가 있었습니다.

  • 이제 이 HighLevelSynthesis 패스는 기저 집합에 따라 최적화 지표를 올바르게 선택합니다. 연속 기저의 경우 2-큐비트 게이트 수를, 클리포드+T 기저의 경우 T 수를 선택합니다. 이전에는 이 정보가 제대로 전달되지 않아 예상보다 낮은 T 수치가 나타났습니다.

  • 회로 텍스트 드로어를 수정하여 클래식 와이어를 사용하는 회로 지침이 별도의 레이어로 그려지도록 했습니다.

  • Operator 사이의 행렬 곱셈(@)은 이제 Statevector 연산자를 상태에 적용하여 결과인 를 Statevector반환합니다.

  • 단일 큐비트 순열을 처리할 때 트랜스파일러 ElidePermutations 단계에서 발생하는 충돌 버그를 수정했습니다.

  • 하나 transpile() 이상의 회로가 포함된 Target 상황에서 layout 명령어를 PassManager.run()SabreLayout 실행하거나, 연결성이 분리된 layout 패스를 다중 처리 환경에서 실행할 때 발생할 수 있는 잠재적인 교착 상태 문제를 수정했습니다. Linux 에서는 두 개 이상의 회로가 있는 transpile() 상태에서 또는 를 PassManager.run() 실행할 때 이것이 기본 동작입니다. 그 외의 모든 플랫폼에서는 멀티프로세싱 컨텍스트를 사용하려면 명시적으로 활성화해야 합니다.

    이는 멀티프로세싱과 멀티스레딩을 혼용할 때 python/cpython#84559 발생하는 CPython의 근본적인 문제로 인해 발생했습니다. 일반적으로 Qiskit은 두 가지 병렬 처리 방식의 혼합을 방지하지만, 분리된 연결성 그래프를 처리하는 경우 멀티스레드 Rust 코드 주변에서 이 보호 장치가 누락되었습니다.

  • 이 메서드는 이제 이전에는 무시했던 Statevector.to_dict() 키워드 decimals 인수를 반영하게 됩니다.

  • 타깃에 지속 시간이 설정된 매개변수화 게이트가 포함된 경우, 해당 타깃의 예약된 회로를 시각화할 때 오류가 발생하던 시각화 timeline_drawer() 기능의 문제를 수정했습니다.

  • ~ 연산자를 SparseObservable 사용한 PauliEvolutionGate 레이블 생성을 수정했습니다. 이제 레이블에는 연쇄된 문자열 형식(예: "XX" "X0 X2") 대신 큐비트 인덱스가 포함된 파울리 연산자(예: )가 표시되므로, 서로 다른 연산자를 구별할 때 가독성이 향상되었습니다.

  • Pauli.evolve() 이제 각도가 π/2\pi/2 의 배수인 경우, 특정 매개변수화 회전 게이트를 포함하는 양자 회로를 올바르게 처리합니다. 예를 들어, RZGate(math.pi/2) 또는 RZZGate(math.pi/2). 이전에는 클리포드 게이트로 인식되지 않아 오류가 발생했습니다.

  • BasePassManager 더 이상 패스에서 반환된 값이 falsy이 아닌 valid인 경우, 이를 원래의 입력 프로그램으로 대체하지 않습니다. 이제 반환 값이 pass 0`` False 이거나 다른 거짓값인 경우 해당 값이 유지되며, 오직 false None 만이 실패를 나타냅니다.

  • QuantumCircuit.compose() 이제 인수가 var_remap 지정되면 Delay 명령어에 사용된 모든 변수와 스트레치를 올바르게 재매핑합니다.

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