Qiskit SDK 2.3 릴리스 노트
2.3.1
Prelude
Qiskit v2.3.1 은 Qiskit v2.3.0 출시 이후 발견된 여러 버그를 수정합니다.
버그 수정
-
이제 의 내장
permutation.kms합성 플러그인이 길이가qiskit.synthesis0인 순열을 올바르게 처리합니다. #15550을 수정했습니다. -
단일 큐비트 클리포드 연산에 대해
synth_clifford_depth_lnn()수정됨. #15780을 참조하십시오. -
연산 재귀적 합성 후 큐비트 상태가 올바르게 업데이트되지 않던 트랜스파일러
HighLevelSynthesis단계의 버그를 수정했습니다. 경우에 따라 이로 인해 패스에서 잘못된 회로가 생성될 수 있습니다. -
함수
qs_decomposition()내부의 선형 대수 루틴에서 발생할 수 있는 오차 허용 범위 문제로 인해 패닉이 발생하여 프로그램이 중단되던 문제를 수정했습니다. 이 문제가 수정되어, 이제 이러한 상황에서는 적절한QiskitError예외나 하위 클래스가 발생합니다.#15610을 수정했습니다.
-
2개 이상의 큐비트가 포함된 게이트에 대해 access
UnitaryGate.control()UnitaryGate.definition및call을UnitaryGate호출할 때의 기본 합성 방식은 내부적으로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 기능
-
특정 게이트나 명령어가 인스턴스와 호환되는지 확인하는
qk_target_instruction_supported()QkTarget기능을 추가했습니다. 이 검사는 제공된 명령어의 이름, qargs 및 매개변수를 기반으로 수행됩니다. -
기존 대상 항목의 이름을 설정하는
qk_target_entry_set_name()기능을 추가했습니다. -
양자 부피 모델 회로를 생성하는 새로운
qk_circuit_library_quantum_volume()기능을 추가했습니다. -
.
QkTarget의 게이트 맵을 반복하고 확인하는 방법을 추가했습니다. 다음 메서드가 추가되었습니다:qk_target_op_num_properties()qk_target_op_index()qk_target_op_name()qk_target_op_qargs_index()qk_target_op_qargs()qk_target_op_props()
그리고 다음과 같은 표현이 추가되었습니다:
QkInstructionProperties:...를 나타내기InstructionProperties위해.
예:
// Create Target with a mix of global and non-global gates. QkTarget *target = qk_target_new(2); // Create a CX entry QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); uint32_t qarg_samples[2][2] = { {0, 1}, {1, 0}, }; double props[2][2] = { {2.7022e-11, 0.00713}, {3.0577e-11, 0.00713} }; for (int i = 0; i < 2; i++) { qk_target_entry_add_property(cx_entry, qarg_samples[i], 2, props[i][0], props[i][1]); } qk_target_add_instruction(target, cx_entry); // Create an SX entry QkTargetEntry *sx_entry = qk_target_entry_new(QkGate_SX); for (int i = 0; i < 2; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(sx_entry, qargs, 1, 35.5e-9, 0.); } qk_target_add_instruction(target, sx_entry); // Create an H entry qk_target_add_instruction(target, qk_target_entry_new(QkGate_H)); // Get the size of the size_t target_length = qk_target_num_instructions(target); for (size_t op_idx = 0; op_idx < target_length; op_idx++) { // Allocate space for qargs and props uint32_t *qargs; uint32_t qargs_len; QkInstructionProperties props; // Retrieve the operation's name char *name = qk_target_op_name(target, op_idx); size_t num_props = qk_target_op_num_properties(target, op_idx); for (size_t props_idx = 0; props_idx < num_props; props_idx++) { // Populate qargs qk_target_op_qargs(target, op_idx, props_idx, &qargs, &qargs_len); // Populate properties qk_target_op_props(target, op_idx, props_idx, &props); } // Free the name string qk_str_free(name); } -
QkTarget이제 사용자에게 직접 해당 시스템에서 작업을 검색할 수 있는 기능을 제공합니다. 다음 메서드가 추가되었습니다:그리고 다음과 같은 표현이 추가되었습니다:
QkTargetOp:.QkTarget에서 연산을 표현하기 위해
-
C API는 이제 기호 및 매개변수화된 표현식을 포함한 게이트 매개변수를 나타내기 위해
QkParam노출합니다. 해당QkParam인터페이스 자체는 표준 산술 연산 및 삼각 함수를 포함한 기호 연산을 지원합니다. 예를 들어,QkParam *x = qk_symbol_new("x"); // a symbol called "x" QkParam *y = qk_symbol_new("y"); // a symbol called "y" QkParam *val = qk_symbol_from_double(2.0); // the value 2.0 QkParam *out = qk_symbol_zero(); // to store the final expression // build 2 sin(x + y) qk_param_add(out, x, y); // out = x + y qk_param_sin(out, out); // out = sin(out) qk_param_mul(out, out, val); // out = out * 2 qk_param_free(x); qk_param_free(y); qk_param_free(val); qk_param_free(out); -
이제 C API는 이를 불투명한 객체로 표현하고
DAGCircuitQkDag조작할 수 있습니다. DAG와 관련하여 다음과 같은 기능이 추가되었습니다:qk_dag_new()qk_dag_add_quantum_register()qk_dag_add_classical_register()qk_dag_free()qk_dag_copy_empty_like()qk_dag_num_qubits()qk_dag_num_clbits()qk_dag_num_op_nodes()qk_dag_node_type()qk_dag_qubit_in_node()qk_dag_qubit_out_node()qk_dag_clbit_in_node()qk_dag_clbit_out_node()qk_dag_wire_node_value()qk_dag_op_node_clbits()qk_dag_op_node_gate_op()qk_dag_op_node_kind()qk_dag_op_node_num_clbits()qk_dag_op_node_num_params()qk_dag_op_node_num_qubits()qk_dag_op_node_qubits()qk_dag_op_node_unitary()qk_dag_apply_barrier()qk_dag_apply_gate()qk_dag_apply_measure()qk_dag_apply_reset()qk_dag_apply_unitary()qk_dag_get_instruction()qk_dag_compose()qk_dag_topological_op_nodes()qk_dag_substitute_node_with_dag()qk_dag_predecessors()qk_dag_successors()
-
DAG 노드의 유형을 구분하기 위해
QkDagNodeType열거형을 추가했습니다. 이것은.qk_dag_node_type()의 반환 유형입니다. -
서로 다른 네이티브 연산 유형을 구분하기 위해
QkOperationKind열거형을 추가했습니다. 이것은.qk_dag_op_node_kind()의 반환 유형입니다. -
지정된 회로의 복사본을 생성하기 위해
qk_circuit_copy_empty_like()추가되었습니다. 이는 원본의 대칭QuantumCircuit.copy_empty_like()복사본입니다. -
일부 회로 및 DAG API 함수에서 복사 모드를 지정하기 위해 사용할 새로운 열거형을 추가했습니다:
-
와
qk_dag_successors()의 반환 유형인 struct를QkDagNeighbors추가하고,qk_dag_predecessors()이에 대응하는 해제 함수 를qk_dag_neighbors_clear()추가했습니다. -
새로운 구조체
QkNeighbors가 추가되었는데, 이는 ``에 의해 암시되는 2-큐비트Target결합 그래프를 나타내는 것이다. 이 변수는 new 함수를 통해qk_neighbors_from_target()초기화되고, 함수를qk_neighbors_clear()통해 초기값이 지워지며, 보조qk_neighbors_is_all_to_all()함수를 가지고 있습니다. -
DAG를 회로로, 회로를 DAG로 변환하는 기능을 지원하기 위해 각각 및
qk_circuit_to_dag()qk_dag_to_circuit()함수를 추가했습니다. -
이제 및
qk_transpile()qk_transpiler_pass_standalone_unitary_synthesis()함수는 회로 내에서 3큐비트UnitaryGate이상의 객체를 합성할 수 있게 되었습니다. Qiskit( 2.2 )에서는 3개 이상의 큐비트 유니터리 합성에 사용되는 기본 합성qs_decomposition()알고리즘이 이전에 Python 로 작성되었기 때문에 이 기능이 지원되지 않았으나, 이제 Rust로 포팅됨에 따라 C를 통해 이 기능을 사용할 수 있게 되었습니다. -
C API에 트랜스파일러 단계 실행을 위한 새 기능을 추가했습니다. 이러한 함수는 다음과 같습니다.
C 함수트랜스파일러 단계qk_transpile_stage_init()초기화 단계 qk_transpile_stage_layout()레이아웃 단계 qk_transpile_stage_routing()라우팅 단계 qk_transpile_stage_translation()번역 단계 qk_transpile_stage_optimization()최적화 단계 이러한 함수는 객체에
QkDag대한 사전 설정된 패스 관리자로부터 이러한 단계를 실행하는 데 사용됩니다. 이러한 함수들의 목표는 사용자 정의 트랜스파일러 패스와 결합될 때 C 언어로부터 조합 가능한 트랜스파일 작업 흐름을 가능하게 하는 것입니다. -
매핑 배열에서 설정된 초기 레이아웃을 사용하여
QkTranspileLayout사용자 정의 객체를qk_transpile_layout_generate_from_mapping()생성하는 새로운 기능을 추가했습니다. 이 함수의 목적은 사용자 정의 레이아웃 트랜스파일러 패스를 위한 레이아웃 객체를 생성할 수 있도록 하는 것입니다. -
VF2 의 부분 그래프 동형성 알고리즘을 통한 두 가지 형태의 "완벽한" 레이아웃 선택 기능이 이제 C API에서 독립형 트랜스파일러 패스로 제공됩니다. 이러한 기능들은
이들은 상호작용의 방향성과 게이트 집합을 처리하는 방식에서 차이가 있습니다.
exact는 모든 게이트를 기본적으로 직접 지원하도록 매치를 요구하는 반면, 는 추가적인 트랜스파일러 패스가 게이트를 특정average큐비트나 링크가 지원하는 집합으로 분해할 것을 기대합니다.이 함수들은 각 옵션에 대한 세터 메서드를 가진 캡슐화된 버전의 VF2 구성(
QkVF2LayoutConfiguration)을 사용합니다. 이는 인수의call_limit새로운 두 한계 형태에 대한 접근을 허용하는 것을 포함합니다.
회로 기능
-
여러 큐비트에 대한 공동 투영 측정을 나타내는 새로운 명령 클래스
PauliProductMeasurement를 추가했습니다. 여기서 측정되는 관측량은 파울리 연산자의 텐서곱입니다. 이 측정의 결과는 또는 중 하나의 고유값이며, 이는 파울리 곱의 고유상태를 나타냅니다.추가 배경 정보는 Daniel Litinski의 "표면 코드의 게임: 격자 수술을 통한 대규모 양자 컴퓨팅 "을 참조하십시오.
A는 에서
PauliProductMeasurement인스턴스화될 수 있으며Pauli, 이때 파울리 벡터는 위상은 포함할 수 있으나, 또는 위상은 포함할 수 없다. 이 명령어는 파울리 벡터와 동일한 수의 큐비트를 가지며, 하나의 고전적 비트를 포함한다.에를 들면 다음과 같습니다.
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인스턴스를 생성할 수 있습니다. -
클리포드 게이트만 포함된 및
QuantumCircuit을front=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), 켈리( ), 켈리-켈리(
RossSelingerSynthesis) 게이트로 구성된 단일 큐비트 양자 회로를 생성하는 새로운 유니타리 합성 플러그인을 추가했습니다.이 플러그인은 매개변수가 로
method설정되었을 때 트랜스파일러UnitarySynthesis"gridsynth"패스에 의해 호출됩니다. -
Clifford+T 기저로 변환할 때, 트랜스파일러
UnitarySynthesis패스는 이제 기본적으로 Clifford+T 합성 알고리즘을 사용하여 단일 큐비트 유니터리를 근사화합니다.마찬가지로, 이
DefaultUnitarySynthesis플러그인은 이제 단일 큐비트 유니터리를 근사화하기 위해 동일한 Clifford+T 합성 알고리즘을 사용합니다. -
이제 새로운
DAGCircuit.to_circuit()방법이 를 편리하게 감싸주는dag_to_circuit()기능을 제공합니다. -
각도가 의 정수 배인 단일 큐비트 회전
RXGate게이트와RYGate회전RZGate게이트를 클리포드 게이트, 게이트TGate및TdgGate게이트의 이산 집합으로 변환하는 새로운 트랜스파일러 패스를 추가했습니다SubstitutePi4Rotations. 의 홀수 배수는 단일TGate및TdgGate게이트와 일부 클리포드 게이트가 필요한 반면, 의 짝수 배수, 즉 의 정수 배수는 클리포드 게이트만으로 표현할 수 있다는 점에 유의하십시오. -
트랜스파일러 패스가 측정값을 처리할
LitinskiTransformation수 있도록 확장되었습니다. 따라서 이 변환은 이제 클리포드 게이트, 단일 큐비트 RZ 회전 게이트( 및 포함), 그리고 표준 Z 측정으로 구성된 회로에 적용되며, 클리포드 게이트를 회로의 맨 끝으로 이동시킵니다. 이 과정에서 RZ 회전을 파울리 회전의 곱(PauliEvolutionGate게이트로 구현됨)으로 변환하고, Z 측정을 파울리 측정의 곱(명령어를PauliProductMeasurement사용하여 구현됨)으로 변환합니다. -
트랜스파일러
OptimizeCliffordT최적화 단계가 대폭 개선되어 Rust로 재구현되었습니다.이 패스는 Clifford+T 게이트셋으로 표현된 회로에 대해 피홀 최적화를 수행합니다. 더 정확히 말하면, 클리포드+T를 포함하는 모든 단일 큐비트 게이트 체인을 최소한의 퀀텀 비트 연산( ) 또는 퀀텀 비트 연산( ) 사용으로 압축합니다. 이 패스는 체인 내 게이트 수에 비례하는 시간 내에 실행됩니다.
-
.
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_qubitsCommutationChecker.commute()를 추가했습니다. 이를 통해, 교환 검사기가 지수적으로 계산 비용이 많이 드는 행렬 표현을 계산할 수 있도록 허용되는 명령어의 크기를 제한할 수 있습니다. 이 새로운 인수를 사용하면 처리할 수 있는 명령어의 크기 제한(기본값이None새로 설정된 로max_num_qubits, 즉 제한이 없음)과 행렬 크기 제한을 구분할 수 있습니다. -
이제 함수
generate_preset_pass_manager()transpile()와 는 Clifford+T 기저 집합으로 컴파일할 때 인자 를unitary_synthesis_method고려하므로, 사용자 정의 유니터리 합성 플러그인을 호출할 수 있게 되었습니다. -
VF2Layout그리고VF2PostLayout이제 부분 후보 레이아웃 점수를 서브그래프 동형 매칭 과정에서 추적합니다. 찾을 수 있는 완벽한 레이아웃이 없을 때는 이 방법이 별다른 효과를 내지 못하지만, 대칭성이 높은 경우 레이아웃을 평가하여 최적의 후보를 선정하는 데 드는 비용을 획기적으로 줄일 수 있습니다. -
이제 와
VF2Layout의 인수는call_limitVF2PostLayout2-튜플이 될 수 있으며, 첫 번째 항목은 첫 번째 일치 항목이 발견되기 전에 사용되고, 그 후에는 처리 범위가 두 번째 항목으로 전환됩니다. 레이아웃이 더 적극적인 정리(pruning)를 통해 실시간으로 점수화되므로, 이는max_trials인수보다 더 신뢰할 수 있는 실행 시간 제한기입니다.
기타 기능
- ``
sampled_expectation_value()함수를 사용하여 Z-기저에서 샘플링된 비트열로부터SparseObservable의 기대값을 계산하는 기능이 추가되었습니다.
업그레이드 주의사항
ConsolidateBlocks이제 진입 시ConsolidateBlocks_qubit_map키를PropertySet읽습니다. 이 키와 해당 값은 공개되지 않으며, 다른 패스가 이를 읽거나 쓰지 않아야 합니다.
C API 업그레이드 노트
qk_target_entry_new_fixed()대상 항목의 이름을 설정하기 위한 추가name매개변수가 있습니다. 고정 각도 입력은 거의 예외 없이 정상적으로 작동하기 위해 표준 게이트의 이름을 재정의해야 합니다.
회로 업그레이드 노트
-
표준 회로 라이브러리 게이트의 정의로 생성된 회로 이름은 이제 로 설정됩니다
None. 이전에는 이러한 회로들이 게이트와 동일한 이름을 가졌기 때문에, 표준 게이트와 이름이 일치하는 불투명 게이트를 매우 쉽게 구성할 수 있었다. 이는 Qiskit에서 표준 게이트 이름은 고유해야 한다는 일반적인 가정을 위반합니다. -
s가 a
QuantumCircuit또는 b에ControlFlowOp추가되면 s의 내부DAGCircuit표현이 변경됩니다. 서킷에 저장된 객체는 나중에 다시 액세스할 때 반환되는 객체가 반드시 서킷에 추가된 것과 동일한 인스턴스일 필요는 없습니다. 사용자는 객 체가 회로에 추가된 후에는 해당 객체를 그 자리에서 수정하려고 시도해서는 안 됩니다. 이는 제어 흐름이든 다른 객체이든 상관없이 회로에 손상을 줄 가능성이 높습니다.PythonQuantumCircuit객체에 대한 모든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 네이티브 방식으로 전환하는 과정에서,
jump를BoxOp포함한 명령어가ControlFlowOp포함된 경우 트랜스파일러의 성능이 일시적으로 저하될 것으로 예상됩니다. 향후 Qiskit 버전에서 성능이 다시 개선될 것으로 기대하며, 이를 통해 제어 흐름 연산에 적용되는 트랜스파일러 패스에서 오랫동안 존재해 온 API의 미비점을 해결할 수 있을 것으로 보입니다. -
인스턴스
ControlFlowOp블록은 더 이상 또는metadata필드를name추적하지 않습니다. 이 기능들은 이미 제어 흐름 빌더 인터페이스를 통해 설정할 수 없었으며, 그 존재는 의도된 API라기보다는 의도치 않은 구현 세부 사항에 불과했습니다. -
인수가 로
annotated설정되어True있고 네이티브 제어 게이트 클래스를 사용할 수 있는 경우, 이 메서드는Gate.control()AnnotatedOperation더 이상 를 반환하지 않습니다. 이 변경 사항은 표준 회로 라이브러리 전반에서 해당 인수가annotated사용되는 방식과 일관되며, 제어 주석이 달린 게이트를 보다 효율적으로 분해할 수 있게 해줍니다. 영향을 받는 게이트는 다음과 같습니다:- 단일 제어
H,S,Sdg,U3Y,Z,SX,,RX,RY,RZ,Swap및CZ게이트; - 이중 제어
Z게이트; - 임의로 제어되는
Phase,CPhase,MCPhase,U1,CU1,MCU1및MCMT게이트.
- 단일 제어
-
이제 의 인수의
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설정할 수 있습니다.
트랜스파일러 사용 중단 사항
- Python 형식으로 기본 근사값을 피클링하는 방식을 기반으로 했던,
SolovayKitaevDecompositiondict에서 사용되던 구식 직렬화 형식을 더 이상 사용하지 않게 되었습니다. 파일 로딩 과정은 잠재적인 보안 취약점이 될 수 있으므로, 신뢰할 수 있는 파일에 대해서만 사용해야 합니다. 새로운 직렬화 형식은 이러한 취약점을 방지합니다. 레거시 형식을 생성하는 함수,generate_basic_approximations()이를 로드하는 함수,SolovayKitaevDecomposition.load_basic_approximations()그리고 의 초기화자 내의 함수는 더SolovayKitaevDecomposition이상 사용되지 않습니다. 대신, 클래스 초기화자에서 안전하게 불러올 수 있는 형식을 생성하려면 를SolovayKitaevDecomposition.save_basic_approximations()사용하십시오.
빌드 시스템 변경 사항
- 소스에서 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 orPropertySetblock_list 키에서 유효하지 않거나 오래된 분석 정보를 감지할 경우, 패닉을 일으키는 대신Python -space예외를 반환합니다. -
Optimize1qGatesDecomposition이제 보다 크거나 보다 큰 회로에서Target실행을 시도할 경우, Rust의 스페이스 패닉 대신TranspilerError이 발생합니다. -
picklepickleSabreSwapSabreSwap.run()메서드가 실행된 후SabreSwapinstance 를 pickle 로 변환할 때 오류가 발생하던 문제를 수정했습니다. #15071을 수정했습니다. -
스케줄링 패스인
ALAPScheduleAnalysis와ASAPScheduleAnalysis는 이제 연산이 없는 회로를 올바르게 처리하게 됩니다. 이전에는 “기간이 지정되지 않았습니다”라는 잘못된 오류TranspilerError메시지를 표시하곤 했습니다. #15145을 수정했습니다. -
연산자가 단위원인지 확인할 때 입력 허용 오차 값이 제대로 반영되지
is_unitary()않던 문제를 수정했습니다. 이제 이 메서드는 연산자를 단순화하고 그것이 항등식과 같은지 확인할 때, 제공된atol및rtol매개변수를 올바르게 사용합니다. 이 업데이트로 #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()이제 각도가 의 배수인 경우, 특정 매개변수화 회전 게이트를 포함하는 양자 회로를 올바르게 처리합니다. 예를 들어,RZGate(math.pi/2)또는RZZGate(math.pi/2). 이전에는 클리포드 게이트로 인식되지 않아 오류가 발생했습니다. -
BasePassManager더 이상 패스에서 반환된 값이falsy이 아닌valid인 경우, 이를 원래의 입력 프로그램으로 대체하지 않습니다. 이제 반환 값이pass0``False이거나 다른 거짓값인 경우 해당 값이 유지되며, 오직falseNone만이 실패를 나타냅니다. -
QuantumCircuit.compose()이제 인수가var_remap지정되면Delay명령어에 사용된 모든 변수와 스트레치를 올바르게 재매핑합니다.