Qiskit SDK 2.2 릴리스 노트
2.2.3
Prelude
Qiskit 2.2.3 는 Qiskit 2.2.2 에서 도입된 버그를 수정합니다. 이 버그는 하나의 PassManager 회로에 대해 run() 메서드를 여러 번 사용할 때 발생했습니다.
업그레이드 주의사항
ConsolidateBlocks이제 입력 시ConsolidateBlocks_qubit_map키를PropertySet읽습니다. 이 키와 그 값은 공개되지 않으며, 다른 패스에 의해 읽히거나 쓰여서는 안 됩니다.
버그 수정
- 동일한
ConsolidateBlocks인스턴스의 고정된 재사용이 다중 회로에서 발생하며, 이는 하나의 회로 이상을 사용하는transpile()호출을 포함하고 프로세스 기반 병렬화가 적용되지 않은 상태입니다. Qiskit 2.2.2 에서 도입된 버그로 인해 동일한 인스턴스를 서로 다른 회로에서 재사용할 경우 패스가 패닉 상태에 빠지거나 잘못된 출력을 생성했습니다.
2.2.2
Prelude
키스킷 2.2.2 은 v2.2 마이너 버전 시리즈의 버그 수정 릴리스입니다.
버그 수정
-
회로 매개변수를 심층 복사하지 않았던 구현을
__deepcopy__()QuantumCircuit수정했습니다. 결과적으로, 복사된 회로에서BoxOp변형된 는 더 이상 원본 회로에 영향을 미치지 않습니다. -
패스가
Optimize1qGatesDecomposition고정된 각도 매개변수를 가진 1-큐비트 게이트를 포함하는Target상태로 초기화될 때 발생하는 문제를 수정했습니다. 이전에는 대상에 포함되지 않은 게이트가 패스를 통해 출력될 가능성이 있었는데, 이는 대상 내 게이트가 임의의 매개변수 값을 지원하는지 여부를 확인하지 않았기 때문입니다. #14743 수정됨. -
다중 큐비트 게이트가 블록
ControlFlowOp내에서 소스 회로의 절대 인덱스 대신BasisTranslator로컬 큐비트 인덱스를 사용하여 추적하는 잘못된 동작을 수정했습니다. -
트랜스파일러
ConsolidateBlocks패스는 이제 제어 흐름 연산으로 재귀 진입하는 동안 주어진 게이트가 하드웨어 지원 여부를 올바르게 평가합니다. -
qpy.dump()QPY 버전 16 이상에서는 표준 라이브러리gzip모듈을 사용하여 열린 파일에.gz대한 쓰기 작업을 처리할 수 있습니다. 자세한 내용은 #15157을 참조하십시오. -
개방 제어 게이트의 제어 상태를 보존하는
MCPhaseGate.inverse()메서드를 수정하여 해당 게이트의 역을 계산할 때 적용했습니다. -
ConsolidateBlocks이제 레거시 키run_list또는block_listPropertySet키에서 유효하지 않거나 오래된 분석을 감지할 때 패닉 상태가 아닌 ' Python -space' 예외를 반환합니다. #14646 수정됨. -
Optimize1qGatesDecomposition이제 보다 큰 회로에서 실행을 시도할 때 RustTarget공간 패닉 대신TranspilerError를 발생시킵니다. #15116 수정됨. -
스케줄링 패스,
ALAPScheduleAnalysis및ASAPScheduleAnalysis는 이제 작업이 포함되지 않은 회로를 올바르게 처리합니다. 이전에 그들은 "기간이 제공되지 않았습니다"라고 허위로 주장하며TranspilerError제기했습니다. #15145 수정됨. -
제어 흐름 연산 내부의 회로 블록이 외부 회로와 다른 레지스터에 정의될 때 발생할 수 있는 회로 텍스트 드로어의 오류를 수정했습니다. 이러한 상황은 예를 들어 연산자를 직접
ControlFlowOp연결할 때나, 트랜스파일링 후 회로에서 발생할 수 있습니다.
2.2.1
Prelude
키스킷 2.2.1 은 2.2.0 릴리스에서 확인된 몇 가지 버그를 수정하는 소규모 패치 릴리스입니다.
트랜스파일러 업그레이드 노트
- 정확한 일치 실행에 대한 최대 호출 및 시험 횟수 제한이 에서
optimization_level=3VF2PostLayout로 축소되었습니다. 이는 대칭성이 높은 시험 회로가 대규모 결합 맵에 매핑될 때 발생하는 과도한 실행 시간을 방지하기 위함입니다.
버그 수정
-
DAGCircuit.apply_operation_back(),apply_operation_back()그리고 이제 결정론적 순서로circuit_to_dag()새로운 변을 추가할 것입니다. 이전 동작은 특정 트랜스파일러 패스(예:SabreSwap)가 DAG를 비결정적 순서로 탐색하게 할 수 있습니다. -
DAGCircuit.apply_operation_front()고전적 조건을 포함하는 노드를 처리할 때 더 이상 무효한 자기 루프를 삽입할 수 없습니다. -
메서드
SabreSwap.run()실행 후SabreSwap인스턴스가SabreSwappickle피클링될 때 발생하는 오류 문제를 수정했습니다. #15071 수정됨. -
연산자가 단일성(유니터리)을 갖는지 검사할 때 입력 허용 오차 값을 제대로 반영하지
is_unitary()않던 문제를 수정했습니다. 이제 해당 메서드는 연산자를 단순화하고 동일성 여부를 확인할 때 제공된atol및rtol매개변수를 올바르게 사용합니다. 이것은 #14107을 수정합니다.
2.2.0
Prelude
키스킷( v2.2 )에는 C API와 트랜스파일러에 대한 몇 가지 개선 사항과 기타 여러 가지 개선 및 버그 수정이 추가되었습니다. 이번 새 릴리스의 주요 기능은 다음과 같습니다:
- C API 트랜스파일 함수: C API에는 이제 양자 회로를 트랜스파일하는 함수가 포함됩니다:
qk_transpile(). 이 함수는 독립형 C 컨텍스트에서 사용되는 Python 함수와 동일합니다transpile().- 리틴스키 변환 패스: 설명된 변환을 구현하는
LitinskiTransformationarXiv:1808.02892 새로운 변환 패스. 이 패스는 일반적으로 내결함성 아키텍처의 컴파일 시에 사용됩니다.- 타깃에 대한 각도 경계 지원: 해당
Target클래스는 이제 타깃에 추가된 매개변수화된 연산에 허용되는 값의 경계를 지정하는 기능을 지원합니다. 명령어에 를 추가할Target때, 선택적 인자 angle_bounds를 사용하여 매개변수화된 회전 게이트의 상한 및 하한을 지정할 수 있습니다. 트랜스파일 파이프라인의 일환으로 각도 제약 조건을 강제 적용하기 위한 새로운 트랜스파일러 패스가WrapAngles추가되었습니다.
v2.2 릴리스 시리즈는 지원되는 마지막 마이너 릴리스 시리즈입니다 Python 3.9. 소스에서 키스킷을 빌드하는 데 지원되는 최소 Rust 버전은 이제 1.79 에서 2.1.0 로 상향된 Rust v1.85 이다. 위 사항 및 기타 변경 사항에 대한 자세한 내용은 아래 릴리즈 노트를 참조하고 업데이트된 문서를 검토하세요.
C API 기능
-
C API에 새로운 독립형 트랜스파일러 패스 함수를 추가했습니다. 이러한 함수는 패스를 실행하기 위해
QkCircuit을 수신하며 인스턴스화된 패스를 호출하는 것과 동일합니다. -
이
QkTarget유형은 이제 모든 매개변수 값을 허용하는 매개변수화된QkGate유형을 지원하는 대상들을 표현할 수 있습니다. 이전에는 이러한 게이트를 대상에 고정된 각도 값으로만 추가할 수 있었으며, 이를 위해 를 사용하여qk_target_entry_new_fixed()를 생성해야QkTargetEntry했습니다. 이제 이qk_target_entry_new()함수는 매개변수화된 게이트와 함께 사용할 수 있습니다. 이 함수는 매개변수화된 게이트와 함께 사용될 때, 대상 게이트가 해당 게이트의 모든 매개변수에 대해 어떤 값이든 지원함을 나타냅니다. 예를 들어,#include <qiskit.h> QkTarget *target = qk_target_new(5); QkTargetEntry *rz_entry = qk_target_entry_new(QkGate_RZ); for (uint32_t i = 0; i < 5; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(rz_entry, qargs, 1, 1.2e-6, 1.3e-9); } qk_target_add_instruction(target, rz_entry); // Clean up after using target qk_target_free(target);이렇게 하면 해당 게이트가 지원하는 모든 파라미터 값의 모든 큐비트에서 RZ 게이트를 허용하는 5큐비트 타겟이 생성됩니다.
-
관측 가능한
QkObs대상에 새로운 큐비트 레이아웃을 적용하기 위해qk_obs_apply_layout()추가됨. 이 함수는 관측 가능한 객체, 새로운 큐비트 인덱스, 그리고 출력할 큐비트 수를 인자로 받습니다. 중요한 점은, 이 함수를 통해 트랜스파일러 패스에 의해QkTranspileLayout일반적으로 지정되는 트랜스파일 레이아웃을 관측 가능 객체에 적용할 수 있다는 것입니다. 예를 들어,// get the number of output qubits -- transpile_layout is a QkTranspileLayout* uint32_t num_output_qubits = qk_transpile_layout_num_output_qubits(transpile_layout); // get the layout including the ancillas (hence the ``false`` in the function call) uint32_t *layout = malloc(sizeof(uint32_t) * num_output_qubits); qk_transpile_layout_final_layout(transpile_layout, false, layout); // apply the layout -- obs is a QkObs* int exit = qk_obs_apply_layout(obs, layout, num_output_qubits); // free the layout array free(layout); -
Qiskit C API에 새로운
qk_transpile()기능을 추가했습니다. 이 함수는 Python 를 사용하지 않고 독립형 C 환경에서 양자 회로를 트랜스파일링하는 데 사용됩니다. 이것은 Qiskit을 사용하는 일반적인 하드웨어 실행 워크플로우를 위한 C API에 필요한 마지막 주요 구성 요소입니다.이 함수는 일부 패스를 제외하고 Python 트랜스파일러에 사용되는 사전 설정 패스 관리자를 미러링하며, C API를 사용하여 구성된 회로와 관련이 없는 경우 기능을 건너뜁니다. 따라서 이 함수는 독립형 C 컨텍스트에만 적합합니다.
-
C API에 새로운 유형
QkTranspileLayout을 추가했습니다. 이 유형은 트랜스파일러로 인한 순열을 추론하는 데 사용됩니다.
회로 기능
-
새로운 방법,
QuantumCircuit.ensure_physical(),가 제공되어 회로가 물리적 큐비트 위에 정의되도록 보장하며, 큐비트 인덱스가 물리적 큐비트를 참조하도록 합니다. 메타데이터 개념에 대한 자세한 내용은 문서에서 추상 회로 및 물리 회로 표현에 관한 새로운 논의를 참조하십시오. "추상" 및 "물리" 회로 개념은 Qiskit에 전혀 새로운 것이 아니라, 단지 명시적인 문서화가 추가된 것뿐입니다. -
Duration클래스는 피코초 단위로 기간을 나타내는 데 사용할 수 있는 새로운ps변형을 얻었습니다. -
개선된
PauliEvolutionGate.control(),PauliEvolutionGate.power()및PauliEvolutionGate.inverse()를 통해 의 관점에서 보다 효율적인 표현을 반환하도록 합니다PauliEvolutionGate. 이 변경 사항은 진화 게이트의 제어 및 지수화 버전을 계산할 때 기존에 사용된 일반적인 메커니즘에 비해 회로 깊이를 현저히 낮추고 게이트 수를 감소시킵니다. 역분해는 변경되지 않지만 이제 더 효율적으로 생성되며 컴파일러 최적화를 향상시킵니다. -
새로운 패스트패스 메서드가
ParameterExpression.bind_all()추가되어 동일한 매핑 사전으로 다양한ParameterExpression인스턴스를 숫자 값에 바인딩하는 사용 사례를 지원합니다. 기존bind()방법은 타입 일관성을 위해 항상ParameterExpression를 반환하기 때문에 상당한 오버헤드와 불필요한 할당이 발생합니다.
OpenQASM 기능
-
OpenQASM3 () 내보내기 기능에서 기호에
defcal대한 부분적 지원을 추가했습니다. 이를 통해 하위 패키지는 양자 비트와 고전 비트 모두에 대해 작동하는 사용자 정의 명령어를.을qiskit.qasm3.dumps()사용하여 내보낼 수 있습니다. 사용자는 이제 사용자 정의 명령어(예: 큐비트에 작용하여 클래식 비트를 반환하는 명령어)CustomMeasure를 정의하고 를DefcalInstruction사용하여 해당 동작을 지정할 수 있습니다. 이러한 defcal은 의 인수를implicit_defcals통해qiskit.qasm3.dumps()익스포터로 전달됩니다.예를 들어,
from qiskit.circuit import Instruction, QuantumCircuit from qiskit.qasm3 import dumps from qiskit.qasm3.exporter import DefcalInstruction, types custom_measure = Instruction("measure_2", 1, 1, []) qc = QuantumCircuit(1, 1) qc.h(0) qc.append(custom_measure, [0], [0]) qc.measure(0, 0) defcals = { "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()), } out_qasm = dumps(qc, implicit_defcals=defcals) print(out_qasm)다음과 같은 유효한 OpenQASM3 문자열을 출력합니다:
OPENQASM 3.0; bit[1] c; qubit[1] q; h q[0]; c[0] = measure_2 q[0]; c[0] = measure q[0];이 접근 방식은 defcal에 대한 문법 정의가 외부(예: 헤더 파일)에서 제공된다고 가정하지만, 내보내기가 작동하는 데 이러한 파일이 반드시 필요한 것은 아닙니다.
-
함수
qasm3.loads()와 에는qasm3.load()이제 라는 추가 인자가num_qubits있습니다. 제공될 경우, 함수는 큐비트가 에 해당하는 회로를num_qubits반환합니다. 지정되지 않을 경우, 반환된 회로의 큐비트 수는 직렬화된 회로에서 관측된 최대 인덱스와 동일합니다. 자세한 내용은 #14435를 참조하십시오
QPY 기능
-
사용자 구성 파일에 라는
min_qpy_version이름의 설정을 추가했습니다. 설정 시,.qpy.load()에 허용되는 최소 QPY 버전을 정의합니다. QPY 파일의 형식 버전이minimum_qpy_version``minimum_qpy_version설정값보다 낮을 경우 예외가 발생합니다. -
QPY 형식 버전 16이 도입되었습니다. 이 새 버전은 파일 헤더에 새로운 회로 시작 테이블을 도입하여 QPY 파일에서 각 회로의 시작 바이트 오프셋을 포함합니다. 이를 통해 QPY 파일에서 회로를 보다 효율적으로 로드할 수 있으며, 향후 멀티스레드 Rust 구현이 가능해질 수 있습니다. 또한 새 형식 버전은 새로운 피코초(
DURATION) 변형에 대한 지원을 추가합니다.
양자 정보 특성
-
Pauli Lindblad 변환에서 하위 시스템을 추적하기 위한 및
PauliLindbladMap.keep_qubits()PauliLindbladMap.drop_qubits()메서드를 추가했습니다. -
스파스 객체를 각각 대응하는 덴스 버전인 와 로 변환하는 메서드
QubitSparsePauli.to_pauli()PauliPauliList와QubitSparsePauliList.to_pauli_list()를 추가했습니다. -
와
PhasedQubitSparsePauliListPhasedQubitSparsePauli클래스를 추가했습니다. 이 클래스들은 각각 큐비트 스파스 형식으로 저장된 단일 파울리 연산자와 파울리 연산자 목록을 나타냅니다. 이 클래스들은 및QubitSparsePauli과 매우QubitSparsePauliList유사하지만, 추가로 위상 정보를 포함합니다. -
메서드를 추가했습니다
QubitSparsePauliList.to_dense_array(). 이것은 값을 가진 정수 배열로Pauli리스트를 반환합니다.
합성 기능
-
부수 큐비트가 필요하지 않으며 기존 알고리즘 대비 우수한 CX 카운트를 가진
ModularAdderGate새로운adder_qft_d00()합성 알고리즘을 추가했습니다: -
보조 큐비트가 전혀
MCXGate필요하지 않은 새로운 합성 알고리즘을 추가했습니다.synth_mcx_noaux_hp24()이 방법은 기존synth_mcx_noaux_v24()알고리즘과 비교하여 CX 게이트의 수가 이차적이지 않고 선형적으로 증가합니다. 특히, 제어 큐비트 수가 5개보다 클 때 새로운 방법이 더 우수하다. 이 알고리즘은 Huang과 Palsberg의 논문 "보조 큐비트 없이 조건부 양자 게이트 컴파일하기"( https://dl.acm.org/doi/10.1145/3656436 )를 기반으로 합니다. -
원래 Shende et al.에 기반한 기능을
qs_decomposition()개선하였습니다. 등 (https://arxiv.org/abs/quant-ph/0406176). 새로운 합성 방법은 Krol과 Al-Ars ( https://arxiv.org/abs/2403.13692 )에 기반하며, 일반적인 n-큐비트 유니터리의 총 sCXGate개수를CXGates만큼 감소시킨다. 개선된 분해 알고리즘을 통해 일반적인 3큐비트 유니터리를CXGate19초(기존 20초 대비)에 분해할 수 있다. -
기본 게이트가 일 때 다중 제어 다중 대상
XGate게이트를 합성하기 위해synth_mcmt_xgate()추가됨. 고수준 합성 플러그인과 함께 선형 개수의 CX 게이트와MCMTSynthesisXGate0개의 보조 큐비트로 분해됩니다.
트랜스파일러 기능
-
새로운 고수준 합성 플러그인을 추가하여 다음을 합성합니다
ModularAdderGate:또한 큐비트 수가 일 때는 다음과 같은 순서로 모듈형 가산기
"ModularAdder.qft_d00"합성기를 따르도록 업데이트되었습니다ModularAdderSynthesisDefault: 모든"ModularAdder.modular_v17"다른 경우에는 -
에 설명된 변환을 구현하는 새로운 arXiv:1808.02892 트랜스파일러 패스를
LitinskiTransformation추가했습니다.패스에 입력되는 회로는 클리포드 게이트와 단일 큐비트 RZ 회전 게이트를 포함하며, 출력 회로는 다중 큐비트 파울리 회전(gates로
PauliEvolutionGate구현됨)에 이어 클리포드 게이트가 적용된 형태입니다. 회로에 지원되지 않는 게이트가 포함된 경우 패스가 예외를TranspilerError발생시킵니다.해당 패스는 반환된 목록에 있는 모든 클리포드
get_clifford_gate_names()게이트, 즉["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]을 지원합니다. 지원되는 RZ 회전 목록은 다음과 같습니다["t", "tdg", "rz"](T 및 Tdg 게이트는 자동으로 RZ 회전으로 변환됩니다).또한 생성자는
LitinskiTransformation인자를 받습니다fix_clifford. (기본값이False아닐 경우), 반환된 회로에는 최종 클리포드 게이트가 생략된 상태로PauliEvolutionGate게이트만 포함됩니다. 이 경우 원본 회로와 합성 회로의 연산자는 일반적으로 동등하지 않다는 점에 유의하십시오.예를 들어,
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import LitinskiTransformation from qiskit.quantum_info import Operator # The following quantum circuit consists of 5 Clifford gates # and two single-qubits RZ-rotation gates (note that Tdg is # an RZ-rotation). qc = QuantumCircuit(2) qc.cx(0, 1) qc.rz(0.1, 0) qc.cz(0, 1) qc.tdg(1) qc.h(1) qc.s(1) qc.cz(1, 0) # The transformed circuit consists of two PauliEvolution gates # and the same Clifford gates as in the original circuit. qct = LitinskiTransformation()(qc) # The circuits before and after the transformation are equivalent assert Operator(qc) == Operator(qct) -
객체를
MCXGate위한 새로운 고수준MCXSynthesisNoAuxHP24합성 플러그인을 추가했습니다. 또한 객체에MCXGate대한 기본MCXSynthesisDefault합성 플러그인이 업데이트되어 사용 가능한 보조 큐비트 수에 따라 항상 최적의 합성 방법을 선택하도록 변경되었습니다. -
명령어에 각도 범위를 지정하기 위한
Target지원을 추가했습니다. 이 릴리스 이전에는 매개변수를 받는 작업이 유효한 값을 허용하거나 특정 값을 허용하도록 지정할Target수 있었습니다. 예를 들어, 대상에 가RZGate(Parameter("theta"))추가된다면, 에RZGate대해 어떤 값의 theta도 허용됨을 나타낼 것이다. 만약 대상에RZGate(math.pi)가 추가된다면, 이는 대상에서 허용되는 값이 오직 뿐임을 나타낼RZGate것입니다. 이 새로운 기능은 허용되는 각도를 양 끝점을 포함한 범위 내의 임의의float값으로 제한할 수 있게 합니다. 예를 들어, 에 를TargetRZGate(math.pi)추가하고 각도 값을 0과 사이로 제한할 수 있습니다.대상에 대한 각도 경계값을 처리하는 데 사용할 수 있는 여러 방법이 있습니다. 첫 번째는
Target.add_instruction()에 새로운angle_bounds키워드 인자를 추가하여 명령어에 각도 제한을 적용하는 기능입니다Target. 각도 경계와 함께 작업하려면, 각도 경계에 대한 게이트 조정 방법을 트랜스파일러와WrapAngles패스에 알려줄 콜백 함수를 글로벌WRAP_ANGLE_REGISTRY레지스트리에 등록해야 합니다. 콜백 함수는 회로에서 게이트 각도를 나타내는 임의의float값 목록과 해당 게이트가 작동한 회로 내 큐비트 인덱스를 입력으로 받으며, 각도 제한 및 기타Target제약 조건을 준수하는 해당 각도의 게이트에 대한 동등한 회로를 나타내는DAGCircuit객체를 반환합니다. 예를 들어,import math from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY target = Target(num_qubits=1) target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)]) def callback(angles: List[float], qubits: List[int]) -> DAGCircuit: """Callback function to wrap RZ gate angles Args: angles: The list of floating point parameter values for the instance of RZGate in the circuit qubits: The physical qubit indices that this gate is operating on Returns: The DAGCircuit of the equivalent circuit""" angle = angles[0] dag = DAGCircuit() dag.add_qubits([Qubit()]) if angle > 0: divisor = math.pi else: divisor = -math.pi gate_counts = int(angles[0] // divisor) rem = angles[0] % divisor for _ in range(gate_counts): dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True) dag.apply_operation_back(rem, [dag.qubits[0]], check=True) WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)Target.has_angle_bounds()대상에 각도 제한이 설정되어 있는지 여부를 확인하는 데 사용할 수 있습니다Target.gate_has_angle_bounds().회로 내의 어떤 게이트에 타깃의 각도 경계를 적용하려면 트랜스파일러
WrapAngles패스를 사용해야 합니다. -
메서드에
Target.instruction_supported()새로운check_angle_bounds키워드 인자(kwarg)를 추가했습니다. 기본값인True로 설정된 경우, 해당 메서드는 지정된parameters가 쿼리 대상 명령어에 적용될 수 있는 각도 제한 조건을 준수하는지 여부를 확인합니다. -
새로운 트랜스파일러 패스를 추가하여.
Target의 게이트에WrapAngles각도 제약 조건을 적용합니다. 만약 정의된 각도 범위가Target있다면, 이 패스는 회로 내 게이트의 모든 매개변수를 분석하고 이를 대상에 지정된 범위와 비교하여 검증합니다. 예를 들어, 대상에 각도 경계가 있는 사용자 정의 게이트가 포함된 경우 패스는 해당 게이트를 경계에 부합하는 게이트로 분해합니다:from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target, WrapAngleRegistry from qiskit.transpiler.passes import WrapAngles class MyCustomGate(Gate): def __init__(self, angle): super().__init__("my_custom", 1, [angle]) param = Parameter("a") circuit = QuantumCircuit(1) circuit.append(MyCustomGate(6.0), [0]) target = Target(num_qubits=1) target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)]) def callback(angles, _qubits): angle = angles[0] if angle > 0: number_of_gates = angle / 0.5 else: number_of_gates = (6.28 - angle) / 0.5 dag = DAGCircuit() dag.add_qubits([Qubit()]) for _ in range(int(number_of_gates)): dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]]) return dag registry = WrapAngleRegistry() registry.add_wrapper("my_custom", callback) wrap_pass = WrapAngles(target, registry) res = wrap_pass(circuit) res.draw('mpl')
-
DAGCircuit이제 수동 구현이 있습니다__deepcopy__(). 이는 특히 대규모 회로에서 피클 프로토콜의 기존 암시적 구현보다 훨씬 더 빠른 속도입니다. 또한 최적화 수준 3에서 내부적으로 각 최적화 루프 반복마다DAGCircuit의 를 깊이 복사하는 과정에서optimization``optimization_level=3, 를transpile()generate_preset_pass_manager()실행하거나 가 반환하는 사전 설정 패스 관리자를 실행할 때 컴파일 성능에 직접적인 이점을 제공합니다. -
새로운 방법,
DAGCircuit.make_physical(), 가 제공되며, 이는 내의 큐비트를 표준DAGCircuit물리적 큐비트 레지스터로 효율적으로 대체하며, 확장 가능성을 포함할 수 있다. 비슷한 방법도 사용할 수 있습니다QuantumCircuit.ensure_physical(). -
새로운 방법,
DAGCircuit.structurally_equal(), 는 두DAGCircuit개의 인스턴스가 정확히 동일한 순서로 생성 및 수정된 경우에 사용할 수 있습니다. 이는==오버로드의 표준 의미적 동등성 검사보다 훨씬 강력한 테스트이며, 트랜스파일러 패스 작성자가 자신의 수정 순서가 결정론적인지 검증하는 데 사용할 수 있습니다. -
의 사용자 정의 하위 클래스는 이제 초기 속성을
BasePassManager초기화하기 위해property_set``_passmanager_frontend()메서드 내에서 속성을 수정할 수 있습니다. 이는 대칭성을 제공하는데, 이전에는. 중에 최종 속성만 읽을_passmanager_backend()수 있었기 때문이다. -
패스에서
HighLevelSynthesis최적화 기준을 지정하는 새로운OptimizationMetric클래스를 추가했습니다. 현재 지원되는 두 가지 메트릭은 다음과 같습니다:COUNT_2Q2-큐비트 게이트 수를 최적화합니다.COUNT_T는 클리포드+T 기저 집합으로 변환할 때 T-게이트 수를 최적화합니다.
트랜스파일러는 기본 게이트 집합에 따라 대상 계량을 자동으로 선택합니다. 예를 들어, 클리포드+T 기본 집합이 감지되면
COUNT_T이를 사용합니다. 그러나 이 클래스는 현재 실행transpile()중이거나 에 의해 생성된 사전 설정 패스 관리자를generate_preset_pass_manager()실행할 때 수동으로 설정할 수 없습니다. -
트랜스파일러
HighLevelSynthesis패스 생성자에 객체를OptimizationMetric인수로optimization_metric받는 새 매개변수를 추가했습니다. 설정 시COUNT_T, 패스는 Clifford+T 게이트 세트에 더 적합한 분해를 선택합니다. -
기본 고수준 합성 플러그인들은 Clifford+T 기저 집합으로 트랜스파일링할 때 더 나은 T-카운트를 생성합니다
ModularAdderGateMultiplierGate. -
기본 고수준 합성 플러그인은 클리포드+T 기반 집합으로
MCXGate트랜스파일링할 때 더 나은 T-카운트를 생성하며, 최소한 1개의 보조 큐비트가 사용 가능한 경우에 해당합니다. -
트랜스파일러
InverseCancellation패스에 기본 역문(反門) 세트가 추가되었습니다. 이전에는 패스 객체의 생성자에 명시적으로 취소할 게이트 또는 게이트 쌍의 목록이 필수 인자로 필요했습니다. 이 목록은 선택 사항이며, 목록이 제공되지 않을 경우 자체 역문은 다음과 같습니다:와 그 반대 쌍입니다:
패스가 취소됩니다.
-
생성자에
InverseCancellation새로운 인자 를 추가했습니다.run_default이 인자를 로 설정하면 사용자 정의 게이트 외에도True새로운 기본 역취소 게이트 목록이 실행됩니다. 이 기능은 기본 게이트 외에도 사용자 정의 역취소 세트를 실행하고자 하는 사용 사례를 위해 제공됩니다. -
TranspileLayout두 가지 새로운 메서드,from_property_set()와write_into_property_set()를 도입하여, 현재의 임시방편적인 트랜스파일 속성 구조와 이를 로 변환하는 방식을TranspileLayout공식화합니다. 이를 통해 트랜스파일러 파이프라인 내의 각 단계는 해당 값이TranspileLayout될 내용을 접근하고, 완전히 구조화된 형태로 수정하며, 이후 표준화된 형태로 다시 출력할 수 있습니다.향후 Qiskit 버전 3.0 에서는 (또는 이와 유사한
TranspileLayout것)이DAGCircuit트랜스파일러 중간 표현의 직접적인 속성이 될 것으로 예상되며, 패스들은 이를 나머지 트랜스파일러 중간 표현과 동기화 상태로DAGCircuit유지해야 할 것입니다. -
해당
transpile()함수와generate_preset_pass_manager()함수가 반환한 생성된 패스 관리자 객체를 사용하여optimization_level=3해당optimization단계에서 실행 중인VF2PostLayout트랜스파일러 패스를 재활성화합니다. 해당 패스는 해당 단계에서 수행된 모든 물리적 최적화 작업 이후에strict_direction=True실행되어, 정확한 출력 회로로 레이아웃을 최종적으로 개선하기 위해 시도합니다. 이 기능은 이전에 Qiskit에서 활성화되었으나( v2.1.0 ), 초기 구현상의 문제로 인해 2.1.2 에서 되돌려졌습니다. 이러한 문제들은 수정되었으며, 더 나은 레이아웃이 발견될 경우 적절하게 적용될 것입니다.
시각화 기능
-
회로 그리기 도구인
qiskit.visualization.circuit_drawer()및 에 대한mpl및text백엔드에 새로운qiskit.circuit.QuantumCircuit.draw()옵션,measure_arrows가 추가되었습니다. 이 옵션이 설정되면True, 드로어는measure상자에서 아래의 클래식 비트까지 화살표를 그립니다. 이것은 서랍에서 이전의 동작이었습니다. 이 값이False로 설정된 경우 화살표는 그려지지 않으며, 대신 해당 레지스터가 사용하는 클래식measure레지스터와 비트가 상자measure안에 표시됩니다. 이를 통해measure상자를 수직 레이어 내에 쌓을 수 있습니다.옵션을 설정하지 않으면 기본값은
True입니다. 사용자는 기본적으로~/.qiskit디렉터리의settings.conf파일에 있는 사용자 구성 파일에서 기본값을 변경할 수 있습니다.[Default]제목 아래에circuit_measure_arrows = False을 입력하여 기본값을 변경할 수 있습니다.
업그레이드 주의사항
- 소스에서 키스킷을 빌드(독립형 모드에서 C API 빌드 포함)하기 위한 최소 지원 Rust 버전이 Rust 1.79 에서 Rust 1.85 로 증가했습니다. 이 변경은 키스킷 내부에서 사용되는 Rust 선형 대수 라이브러리 faer의 최신 버전을 사용하기 위해 필요했습니다. 이전 버전의 faer로 Windows에서 키스킷을 실행할 때 확인된 문제가 있었습니다. 이 문제는 최신 릴리스에서 수정되었지만 최신 버전의 faer를 빌드하려면 최신 버전의 Rust 컴파일러가 필요합니다.
회로 업그레이드 노트
-
의 회로 정의가 를 사용하도록
ModularAdderGateadder_modular_v17()업그레이드되었습니다. 기존 동작을 얻으려면 대신adder_qft_d00()의 정의를 사용하십시오. -
메서드
XGate.control(),CXGate.control(),CCXGate.control(),C3XGate.control()C4XGate.control(),, 및 는 인자 가annotated로MCXGate.control()설정되었을 때 더 이상AnnotatedOperation를 반환하지 않으며, 대신 가True일annotated때 얻게 되는 것과MCXGate동일한False명시적 를 반환합니다. 이는 표준 회로 라이브러리 전반에서 인수가annotated사용되는 방식과 일관되며, 일반적으로 네이티브 게이트 클래스가 이미 존재할 경우AnnotatedOperation인수를 도입하지 않도록 합니다. 실제로 이는 MCX 계열의 제어 주석이 달린 게이트에 대한 보다 효율적인 분해로 이어진다.
C API 업그레이드 노트
-
uintptr_t의 대부분의 사용법이size_t으로 변경되었습니다. 특히 다음과 같은 사용법이 변경되었습니다:QkOpCount.countQkOpCounts.lenQkObsTerm.len- .
qk_circuit_num_instructions()의 반환 유형 - .
qk_circuit_get_instruction()에 대한index논증. - .
qk_obs_new()에 대한boundaries논증. - ,
qk_obs_len(), 및qk_obs_num_terms()의 반환qk_obs_boundaries()유형. - 의 반환
qk_target_entry_num_properties()유형, 그리고qk_target_num_instructions().
이 변경은 키스킷의 러스트 코드에서 C 헤더 파일을 생성하는 데 사용되는 도구인 cbindgen이
size_t이 러스트의 유형 사용법과 더 정확하게 일치하는 곳에서 기본적으로uintptr_t을 사용했기 때문에 필요했습니다. 이 변경은 C API의 값이 어떻게 사용되는지 보다 명확하게 하기 위해 이루어졌습니다.
QPY 업그레이드 노트
- 에 의해 생성되는 QPY의 기본 버전은 이제
qpy.dump()QPY 형식 버전 16입니다. 다른 형식 버전이 필요한 경우 인수를version사용하여 이전 형식 버전을 지정할 수 있습니다.
양자 정보 업그레이드 노트
SparsePauliOp.assign_parameters()모든 매개변수가 숫자 값으로 완전히 바인딩된 경우 출력coeffs배열의complexdtype을 설정합니다.
합성 업그레이드 노트
- 의 인수
opt_a1와opt_a2의 기본값은 이제opt_a1 = Noneqs_decomposition()와 입니다opt_a2 = None. 새로운 기본값은 인수에mat대한 입력 유닛이 제어되는지 여부에 따라 최적의 값을 선택하여 기본적으로 최소CXGate카운트를 생성합니다. 이전 동작이 필요한 경우, 명시적으로 와opt_a2 = True를opt_a1 = True호출하여 이전 릴리스와 동일한 동작을 유지할 수 있습니다.
트랜스파일러 업그레이드 노트
- 회로는
PassManager이제 개별 패스에서 실행이 시작되기 전에 항상num_input_qubits속성original_circuit_indices과 를 설정합니다. 이것들은 입력 회로의 속성들로, 이전에는 개별 패스들이 주로 설정해야 했던 것들로서, 종종 그들의 주요 목적의 부수적 효과로 설정되곤 했습니다.
회로 사용 중단
-
회로 라이브러리의 다음 클래스는 키스킷 2.2 에서 더 이상 사용되지 않으며 키스킷 3.0 에서 제거될 예정이다. 이 게이트는 최신 게이트와 동등한 것으로 대체되었습니다.
버그 수정
-
ApplyLayout이제 0큐비트 적용 사례를 올바르게Layout처리할 것입니다. 이전에는 의 필드가"layout"PropertySet와 같더라도 레이아웃이 설정되지Layout()않았다고 주장했습니다. -
빈 인스턴스가 전달될 때마다
QkOpCounts인스턴스 생성qk_opcounts_clear()시 및 호출 시 발생하는 메모리 누수 문제를 수정했습니다. -
이전에는 연산자 목록으로부터
PauliEvolutionGate무효한 것을 정의할 수 있었는데, 여기서 연산자들은 모두 동일한 수의 큐비트에 대해 정의된 것이 아니었다. 이 문제는 이제 수정되었으며, 게이트가 정의될 때 오류가 발생합니다:from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate pauli = Pauli("XYZ") # 3 qubits op = SparsePauliOp(["XYIZ"], [1]) # 4 qubits evo = PauliEvolutionGate([pauli, op], time=1) -
트랜스파일러
VF2Layout패스에서 고정된 시드 세트가 설정된 경우에도 패스의 출력이 비결정적일 수 있는 문제를 수정했습니다. 특히 입력 회로에 단일 큐비트 연산만 포함된 활성 큐비트가 존재할 경우 해당 현상이 발생했습니다. 수정됨 #14729 -
여러 회로로 실행 시 함수가
callback호출되지 않던PassManager.run()버그를 수정했습니다. 이제 각 회로에 대한 각 패스에서, 병렬 실행을 포함하여 콜백이 올바르게 트리거됩니다. -
트랜스파일러
CommutativeInverseCancellation패스에서 여러 문제를 수정했습니다. 이 패스는 이제 연산, 제어 흐름 연산 및 와Clifford같은 비가역 연산을 포함하는Initialize회로에서 올바르게 작동합니다.또한 패스는 이제 역 게이트 쌍을 식별할 때 항상 구문(비매트릭스 기반) 검사를 먼저 수행합니다. 게이트가 구문적으로 동일하지 않은 경우,
matrix_based인수가True으로 설정되고 연산이max_qubits큐비트 이상에서 동작하지 않으면 매트릭스 기반 검사도 수행됩니다. 이렇게 하면 패스의 감소 가능성이 약간 향상됩니다. -
트랜스파일러
CommutativeCancellation패스(그리고 그에 따라transpile())에서 회로의 글로벌 단계가 올바르게 업데이트되지 않던 여러 문제를 수정했습니다. 특히, X-게이트와 RX-게이트를 병합하면 위상 불일치가 발생했으며, 각도가 다음과 같은 형태인 파울리 회전 게이트( )를 제거할 때, 는 잘못된 위상 이동( )을 생성했습니다. -
표준 제어 게이트가 올원(all-ones) 상태가 아닌 다른 상태에서 제어될 경우 올바르게 처리되지 않던 문제를 수정했습니다
CommutationChecker. 수정됨 #14974 -
.
CommutativeCancellation의 비결정성을 수정했습니다. 이는 내장된 표준 정렬 함수 덕분에 노드 순서 결정성이 중요한 경우 일반적으로 사용해야 하는 또는topological_op_nodes()DAGCircuit.topological_nodes()가 반환하는 순서에는 영향을 미치지 않았습니다. 그러나 임의의 순서로 노드를 검사하는 경우(DAGCircuit.op_nodes()) 또는 에지 구조를 검사하는 경우(DAGCircuit.edges()), 호출 후 반복 순서는CommutativeCancellation비결정적이 될 것이다. -
오픈 컨트롤 MCX 게이트에 추가
MCXGate컨트롤을 추가할 때MCXGate.control(), 해당 컨트롤 MCXctrl_state게이트의 크기를 고려하지 않아 확장된 MCX 게이트의ctrl_state크기가 잘못 계산되던 버그를 수정했습니다. 명시적인 MCX 클래스CXGate,CCXGate,C3XGate, 및C4XGate는 이미 올바르게 처리되었음을 유의하십시오. -
Python 3.9 에 대한 사용 중단 경고가 사용자 코드에 의한 것으로 올바르게 식별되도록 수정했습니다. 이전에는 사용자 코드로 인해 발생한 것으로 식별되지 않았기 때문에 Python 의 기본 경고 필터가 사용자에게 경고를 표시하지 않았습니다.
-
dimacs 파일에서 로드하려고 할 때 발생하는
PhaseOracle오류가PhaseOracleGateBitFlipOracleGateTypeError수정되었습니다. -
트랜스파일러
ElidePermutations패스에서 s가PermutationGate존재할 때 큐비트 매핑이 올바르게 업데이트되지 않아 잘못된 회로가 생성되고 패스 매니저의 속성 세트가 잘못 업데이트되는 버그를 수정했습니다. -
내장 트랜스파일러는 해당
final_layout속성을 설정하는 경우, 해당 필드가 이미 설정된 상태라면 이제 이 필드의 업데이트를 올바르게 처리합니다. 이것은 이제 를 설정하는 한 번 이상의 패스를TranspileLayout.routing_permutation실행한 후 올바른final_layout순열을 반환하는 방법으로 관찰될 수 있다.이는 Qiskit의 내장 플러그인을 사용한
generate_preset_pass_manager()또는transpile()에 대한 일반적인 호출에는 영향을 미치지 않았습니다. 이러한 형태로 구성된 파이프라인은 를 두 번 이상final_layout설정하려고 시도하지 않습니다. -
회로에
HighLevelSynthesis클래식 레지스터를 가진 상위 레벨 객체가 포함된 경우, 해당 객체 내 상대 인덱스로 매핑되는 버그를 수정하였습니다. 이는 외부 회로의 대응 인덱스로 매핑되어야 하는 부분입니다. 클래식 레지스터가 이제 외부 회로 인덱스에 올바르게 매핑됩니다. -
기존 명령어와 일치하는 및
parametersoperation_name인수로 메서드가 호출될 때 명령어의 큐비트 순서 검사가 생략되던 버그를 수정했습니다.Target.instruction_supported() -
인수가
max_trials또는 음수로VF2LayoutNone설정되었을 때의 동작을 수정했습니다. 해당 패스는 옵션이 설정된 경우 회로 또는 대상의 크기를 기준으로 검색을 제한하는 것으로 문서화되었으며None, 무제한 검색을 지정하기 위해 음수 값을 허용하는 것으로 기록되었습니다. 그러나 2.1.0 에서 이 동작이 잘못 변경되어 무한한 검색을 수행하게None되었으며, 음수를 사용하려고 하면 오류가 발생하게 되었습니다. 이러한 누락 사항들은 패스가 문서화된 대로 동작하고 이전 릴리스와 일관성을 유지하도록 수정되었습니다. -
고수준 합성
MCXSynthesis1DirtyKG24MCXSynthesis2DirtyKG24플러그인에서 사용 가능한 깨끗한 보조 큐비트를 사용 가능한 더러운MCXGate보조 큐비트로 간주하지 않는 문제를 수정했습니다. 특히, 깨끗한 보조 큐비트 하나와 더러운 보조 큐비트 하나가 사용 가능한 경우 플러그인이 적용되지MCXSynthesis2DirtyKG24않았다. -
이제 이
PauliEvolutionGate.to_matrix()메서드는 정확한 행렬 지수 를 반환합니다. 여기서 는 게이트에 전달된operator``time및 입니다. 이것은 예상치 못한 동작을 수정합니다. 왜냐하면 는PauliEvolutionGate정확한 시간 진화를 나타내도록 문서화되어 있지만, 이전에는 행렬이 컴파일러가 시간 진화를 어떻게 근사화하는지에 따라 달라졌기 때문입니다. 해당to_matrix메서드는 이제 문서와 일관성을 유지합니다. -
다수의 하위 표현식을 결합하여 점진적으로 빌드할 때
ParameterExpression발생하는 성능 저하 문제를 수정했습니다. 수정됨 #14653 -
지연 명령어가 포함된 회로를 'ps' 단위를 사용하여 QASM3 으로 내보낼 때 정확성 버그가 수정되었습니다.
-
회로
QFT표시 시 발생하는 특수한 경우를 수정했습니다. 이전에는 가QFT.inverse()호출된 후 QFT 회로의 속성이 수정되면, QFT가 로 표시되었습니다"IQFT_dg". 이것은 잘못된 것이었고, 이제 올바르게 표시됩니다"IQFT". #14758 수정됨. -
플러그인의
PauliEvolutionSynthesisRustiq버그를 수정했습니다. 해당 버그는 연산자의 객체가PauliEvolutionGate유형의 객체를 포함하는 경우 잘못된SparseObservable회로를 생성하는 문제였습니다.예를 들어,
from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable, Operator from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4) evo = PauliEvolutionGate(obs, 1) qct = PauliEvolutionSynthesisRustiq().run(evo) assert Operator(qct) == Operator(evo) -
함수에서
generate_preset_pass_manager()인수가backend설정되지 않았을 때 제공된 객체에Target포함된 타이밍 제약 조건 데이터를 잘못 무시하는 문제를 수정했습니다. 수정됨 #14329 -
ObservablesArray.coerce_observable()에서 관측값이 헤르미티안이 아닌 예외가 과도하게 트리거되던 버그를 수정했습니다.zero과 같은 관찰 가능 항목은 허용되지 않으며 이제 정상적으로 실패를 호출합니다. -
qiskit.circuit.library.quantum_volume()해당 인자(seednumpy.random.Generatorargument)의 입력값으로 를 처리하도록 업데이트되었습니다. 이전에는 이러한 생성자 인자가.TypeError을 발생시켰을 것입니다. -
QuantumCircuit.compose()이제 인수가var_remap지정된 경우Delay명령어에서 사용되는 모든 변수와 구간을 올바르게 재매핑합니다. -
SabreLayout시험 중 하나로 "고밀도 부분집합" 레이아웃을 사용하며, 동일한 알고리즘을 따릅니다DenseLayout. 그러나 이전에는 Sabre가 사용한 버전이 더미 보조 큐비트를 포함한 모든 가상 큐비트를 물리적 큐비트에 할당하여 알고리즘의 효율성을 저해했으나, 정확성 자체는 훼손하지 않았습니다. 이제 Sabre는 이 초기 시험을 위해 사용자가 정의한 가상 큐비트만을 사용할 것이며, 이는 대규모 회로 클래스에서 평균화할 때 레이아웃 선택에 소폭의 개선을 가져올 수 있습니다. -
중복을 병합하기 전에 계수의 크기에 따라 파울리 항을 제거하는 메서드의 버그를
SparsePauliOp.simplify()수정했습니다. 이로 인해 두 가지 주요 경계 사례에서 잘못된 동작이 발생했습니다:- 여러 개의 동일한 폴리 항이 개별적으로 단순화 임계값보다 작지만 합이 임계값을 초과하는 작은 계수를 가진 경우, 해당 항이 잘못 제거되었습니다.
- 여러 개의 동일한 폴리 항이 임계값을 초과하지만 합이 0에 가까운 계수를 갖는 경우 잘못 보관된 것입니다.
자세한 내용은 #14194를 참조하세요.
-
TranspileLayout.initial_index_layout()이제 생성자에서 인덱스 순서로initial_layout지정되지 않은 가상 큐비트가 포함된 경우 해당filter_ancillas=True인수를 올바르게 처리합니다. -
VF2Layout그리고 이제 완전히 유휴 상태인 큐비트에 대한 (VF2PostLayout임의의) 레이아웃 할당을 올바르게 포함할 것입니다. 이전에는 컴파일 후 호출이TranspileLayout.initial_index_layout()실패하는 것으로 관찰되었을 수 있습니다. -
트랜스파일러
VF2PostLayout패스에서 문제를 수정했습니다. 특정 상황에서 패스가 인자로 실행될 때 회로의 상호작용 그래프에 1큐비트 연산만 수행하는strict_direction=True큐비트가 포함된 경우 잠재적인 런타임 확장성 문제가 발생할 수 있었습니다. 이러한 매핑 문제로 인해 점수 산정 과정에 조합적 복잡성이 발생하며, 이로 인해 패스가 거의 항상 점수 산정 시간 제한에 걸리게 되고 일반적으로 레이아웃 개선 효과가 나타나지 않습니다. 모드에서는strict_direction=False이러한 문제들에 대해 최적화된 검색 구현이 존재하지만, 에 대한 추가 제약strict_direction=True조건들로 인해 이 접근법은 실행 가능하지 않습니다. 대신 이러한 경우 레이아웃 문제가 패스에VF2PostLayout적합하지 않으므로 검색을 건너뜁니다.
기타 참고사항
- 현재
SabreSwap및SabreLayout에서 사용 중인 Sabre 라우팅 구현은 내부 가상 상호작용 표현 내에서 동시에 자동으로 라우팅 대상이 될 수 있는 연속된 노드들을 압축합니다. 이는 라우팅 효율을 향상시키고 중간 메모리 사용량을 줄이며, 2q 게이트의 연속으로 인한 휴리스틱 구성lookahead요소의 편향을 방지합니다.
2.1.0rc1
지원 중단 노트
-
Python 3.9 으로 키스킷 실행에 대한 지원은 더 이상 사용되지 않으며, 키스킷 2.3.0 릴리스에서 제거될 예정입니다. 2.3.0 은 Python 3.9 이 수명이 종료되어 더 이상 지원되지 않는 후 첫 번째 릴리스입니다. [1] 즉, 2.3.0 릴리스부터는 사용 중인 Python 버전을 Python 3.9 이상으로 업그레이드해야 합니다.