키스킷 SDK 2.0 릴리즈 노트
2.0.3
Prelude
키스킷 v2.0.3 은 v2.0 마이너 버전 시리즈의 버그 수정 릴리스입니다.
버그 수정
-
ApplyLayout은 이제 제로 큐비트를 적용하는 경우를 올바르게 처리합니다Layout. 이전에는"layout"필드가 같더라도 레이아웃이 설정되지 않았다고 주장했습니다PropertySet가Layout()와 같더라도 레이아웃이 설정되지 않았다고 주장했습니다. -
트랜스파일러 패스의 문제를 수정했습니다
ElidePermutations트랜스파일러 패스에서 출력 순열이 올바르게 업데이트되지 않던 문제를 수정했습니다PermutationGate연산이 있을 때 출력 순열이 올바르게 업데이트되지 않던 문제를 수정했습니다. 이렇게 하면 출력 회로가 잘못되고property_set의virtual_permutation_layout속성이 잘못 설정됩니다. 대규모의 일부로 실행할 경우PassManager의 일부로 실행하면 잘못된TranspileLayout가 출력 회로에서QuantumCircuit.layout출력 회로에 반환됩니다. -
패스의 버그를 수정했습니다
HighLevelSynthesis중첩/커스텀 객체를 언롤링할 때Instruction객체를 펼칠 때의 버그를 수정했습니다. 만약QuantumCircuit에 의해 반환된Instruction.definition에 의해 반환된 객체에Clbit객체를 포함하는 경우, 이러한 클래식 비트는 내부 인덱스 내부의Instruction.definitionQuantumCircuit의 내부 인덱스를 외부의 해당 인덱스에 매핑하는 대신QuantumCircuit. -
의 버그를 수정했습니다
PauliEvolutionSynthesisDefault및PauliEvolutionSynthesisRustiq플러그인의 버그가 수정되었습니다.preserve_order=False. 플러그인의 동작이 복원되었으며 이제 트랜스필레이션 파이프라인 전체에서 원래 회로가 보존됩니다. -
지원되는 최소 rustworkx 버전( 0.15 )과의 호환성 문제를 수정했습니다. 특정 입력값을 사용하면
VF2Layout및VF2PostLayout는 이전에 rustworkx 0.16.0 에 추가된 rustworkx 메서드를 사용했기 때문에 지원되는 것으로 나열된 이전 rustworkx 릴리스를 사용할 때 오류가 발생할 수 있습니다. -
SabreLayout와SabreSwap를 사용하는 회로에 라우팅 결과를 적용할 때 더 이상 당황하지 않습니다expr.Var또는Stretch객체를 사용하는 회로에 라우팅 결과를 적용할 때 더 이상 당황하지 않습니다. -
qiskit.circuit.library.quantum_volume()를 처리하도록 업데이트되었습니다numpy.random.Generator를seed인수의 입력으로 처리하도록 업데이트되었습니다. 이전에는 이러한 생성기 인수가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) 회로 구성이 수정되었습니다
IQP와iqp(). 이전 구현에서는 게이트의 권한 대신 게이트의 권한을 잘못 사용했습니다. -
SabreLayout는 이제 회로의name및metadata필드를 조인트 레이아웃 및 라우팅 패스로 수행할 때 올바르게 전파합니다. -
단일 합성 플러그인의 문제를 수정했습니다
SolovayKitaevSynthesis단일 합성 플러그인에서 다른 베이시스 게이트로 플러그인을 반복적으로 실행하면 첫 번째 실행의 베이시스 게이트만 잘못 재사용되는 문제를 수정했습니다. 이 문제는 기본 근사치를 캐싱할 때 기준 게이트를 무시했기 때문에 발생했습니다. -
트랜스파일러 패스의 문제를 수정했습니다
SolovayKitaev트랜스파일러 패스에서 내부 재귀에서 180도 회전이 발생하여 패스가 제대로 처리되지 않아 충돌이 발생할 수 있는 문제를 수정했습니다. -
트랜스파일러 패스의 문제를 수정했습니다
SolovayKitaev트랜스파일러 패스에서 생성된 근사값이 올바른 값과 차이 나는 위상을 가질 수 있는 문제를 수정했습니다. 이는 큐비트 게이트 행렬의 올바른 부호를 얻기 위해 추가 처리가 필요한 내부 표현으로 인해 발생한 결과입니다. 수정 #9552 -
스트레치가 있는 지연이 포함된 회로(
QuantumCircuit.add_stretch())는 이제 사전 설정된 패스 관리자(transpile()및generate_preset_pass_manager())를 사용하여 정렬 제약 조건이 있는 백엔드(예: IBM 퀀텀 이글 디바이스(ibm_sherbrooke))를 타깃팅할 수 있습니다. -
의 폴백 오류 휴리스틱은
VF2Layout및VF2PostLayout의 오류 휴리스틱은 보고된 오류율이 없을 때 사용되며, 이전에는 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) -
두 개의 새로운 클래스를 추가했습니다:
BitFlipOracleGate과PhaseOracleGate.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')
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')
-
새로운 제어 흐름 연산
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())이 유형은 주로 타이밍 관련(
duration및stretch) 표현식에 사용하기 위한 것입니다. 비트 연산이나 논리 연산과는 호환되지 않지만, 먼저 명시적으로 다른 곳에 캐스팅하면 함께 사용할 수 있습니다. -
다중 제어 단일 큐비트 단일 게이트를 분해할 때 2큐비트 게이트의 수를 줄였습니다. 예를 들어,
-
기존의 실시간 표현식 모듈인
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(). 결과 표현식은 상수 표현식 유형Duration의duration인수로 사용할 수 있는 상수 표현식입니다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변형 버전이 추가되었습니다. 다음과 같습니다.ExactReciprocalGate(대체ExactReciprocal)IntegerComparatorGate(대체IntegerComparator)LinearPauliRotationsGate(대체LinearPauliRotations)PiecewiseLinearPauliRotationsGate(대체PiecewiseLinearPauliRotations)PiecewiseChebyshevGate(대체PiecewiseChebyshev)PiecewisePolynomialPauliRotationsGate(대체PiecewisePolynomialPauliRotations)PolynomialPauliRotationsGate(대체PolynomialPauliRotations)LinearAmplitudeFunctionGate(대체LinearAmplitudeFunction)QuadraticFormGate(대체QuadraticForm)WeightedSumGate(대체WeightedAdder)
기본형 기능
- 새로운
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. 이에 해당하는 하이 레벨 합성 플러그인은IntComparatorSynthesis2s과IntComparatorSynthesisNoAux. 컴파일러가 사용 가능한 보조 큐비트를 기반으로 최적의 분해를 선택하도록 하려면, 사용 가능한 보조 큐비트에 따라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를 추가하여 큐비트의 하위 집합이나 특정 폴리 문자열을 측정할 때 회로의 라이트콘을 반환합니다.예를 들어 다음 회로의 경우입니다:
패스를 실행하면 결과에 영향을 미치지 않는 게이트가 제거됩니다:
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")
-
클래스에 새 인수
max_block_width를 추가했습니다BlockCollector클래스와CollectLinearFunctions및CollectCliffords트랜스파일러 패스를 추가했습니다. 이 인수를 사용하면 노드 블록이 정의되는 최대 큐비트 수를 제한할 수 있습니다.예를 들어,
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_back을CollectMultiQBlocks트랜스파일러 패스에 추가했습니다.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. 부분적으로 적용된 컴파일을 다시 시작하거나 이전 컴파일의 특정 분석을 새로운 위치에서 재사용하는 데 사용할 수 있습니다. -
스케줄링 패스
PadDelay와PadDynamicalDecoupling의 생성자에 새로운 인수가 생겼습니다:target와durations. 이들은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,Target및DAGCircuit및 펄스 기반 가짜 백엔드. 펄스와 관련된 제거된 구성 요소에 대한 자세한 내용은 아래 해당 섹션을 참조하세요.펄스 사용 중단에 따른 초기 계획과 마찬가지로 키스킷 다이내믹스로의 펄스 마이그레이션은 키스킷 다이내믹스 개발 우선순위로 인해 보류되었음을 알려드립니다. 키스킷 펄스를 백엔드 지원을 위한 프론트엔드로 사용하거나 다른 사용 사례에서 사용하고자 하는 사용자는 펄스 기능이 포함된 v2.0.0 이전 키스킷 버전에서도 계속 사용할 수 있습니다.
-
모듈의
sequence과schedule함수는compiler모듈의 함수는 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이들은 백엔드 정의를 사용하여 회로를 펄스 구성 요소로 변환할 수 있는 기능에 의존했는데, 이 기능은 더 이상 존재하지 않습니다. 이러한 이유로 대안이 제시되지 않은 채 삭제되었습니다. 이러한 제거는 펄스 패키지와 관련이 있으며, 키스킷 2.0 에서도 제거되고 있습니다.
회로 업그레이드 노트
-
Bit와Register와 그 하위 클래스 클래스는 Python 으로의 변환으로 인해 Python 에 노출된 각 인스턴스를 다시 할당할 수 있으므로is검사를 사용하여 더 이상 비교가 보장되지 않습니다. -
Bit과Register(및 그 서브클래스)는 더 이상 서브클래싱할 수 없습니다. 이는 지원되는 동작이 아니며, 그렇게 하면 키스킷에서 지정되지 않은 동작이 발생할 수 있습니다. 더 이상 클래스의 구현 세부 사항으로 이 작업을 수행할 수 없습니다. -
더 이상 베이스의 인스턴스를 생성할 수 없습니다
Bit및Register클래스의 인스턴스를 생성할 수 없습니다. 이러한 클래스를 직접 인스턴스화하는 것은 지원되지 않는 것으로 명확하게 문서화되어 있었고, 이전 릴리스에서는 클래스 계층 구조의 구현 아티팩트에 불과했습니다. 키스킷( 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')
이 변경은 합성 효율성에 영향을 줄 수 있지만, 키스킷이 지원하는 모든 플랫폼 및 Python 버전과의 호환성을 위해 필요했습니다.
-
에서 통근을 확인하는 데 사용되는 메트릭을 업데이트했습니다
CommutationChecker. 커뮤테이션의 평균 게이트 충실도가(1 - 1e-12)이상이면 두 개의 게이트가 커뮤테이션하는 것으로 가정합니다. 이 값은 충실도 계산에서 반올림 오류를 고려하고RemoveIdentityEquivalent및TwoQubitWeylDecomposition. 자세한 내용은 클래스 문서 문자열을 참조하세요. -
메서드
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에서 레거시 항목을 빌드하는 데 사용되는 내부 유형이므로NLocal와ZZFeatureMap. 이 변경의 영향을 받는 클래스 전체 목록은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이 설치되어 있는지 확인해야 합니다. -
더 이상 사용되지 않는
DAGNodedag인수가 클래스 및 하위 클래스에서 제거되었습니다DAGNode클래스와 그 서브클래스에서 제거되었습니다:DAGOpNode,DAGOutNode와DAGInNode.dag매개 변수는 이러한 객체를 구성할 때 선택적 인수가었지만 v1.3 릴리스 이후에는 사용되지 않고 무시되었으며 v1.4 릴리스 이후에는 더 이상 사용되지 않습니다. -
다음
QuantumCircuit메서드:castcbit_argument_conversioncls_instancescls_prefixqbit_argument_conversion
은 Qiskit 1.2 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이러한 메서드는 내부 도우미 함수이며 공개 API를 위한 것이 아닙니다. 대체품은 제공되지 않습니다.
-
더 이상 사용되지 않는 속성
Instruction및Gateduration및unit속성이 제거되었으므로 더 이상unit또는duration인수를 설정할 수 없습니다qiskit.circuit.Instruction또는 서브클래스에 대해 인수를 설정할 수 없습니다. 이러한 속성은 키스킷 v1.3.0 에서 더 이상 사용되지 않으며, 개별 명령어에 사용자 지정 실행 기간과 해당 기간의 단위를 첨부하는 데 사용되었습니다. 그러나 게이트 기간의 진실의 출처는BackendV2Target이며, 여기에는 백엔드에서 지원되는 각 명령어의 지속 시간이 포함되어 있습니다. 인스트럭션의 지속 시간은 일반적으로 사용자가 조정할 수 없으며 백엔드의 불변 속성입니다. 이전에 이 기능을 사용하여 다양한 게이트 지속 시간을 실험한 경우, 주어진 게이트의InstructionProperties.duration필드를 변경하여Target필드를 변경하여 백엔드에서 인스트럭션에 대한 사용자 지정 기간을 설정할 수 있습니다. 단위는 항상 초 단위입니다(Target.) -
더 이상 사용되지 않는 속성
qiskit.circuit.Instruction및Gatecondition의 속성이 제거되었습니다. 이 기능은 회로의 기존 상태를 설명하는 데 사용할 수 있는IfElseOp클래스로 대체되었으며, 회로의 고전적인 조건을 설명하는 데 사용할 수 있습니다. 이 속성은 v1.3.0 릴리스에서 더 이상 사용되지 않습니다. -
더 이상 사용되지 않는 메서드
Instruction및Gatec_if및condition_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,DAGCircuit및DAGDependency클래스에서 제거되었다. 이 외에도has_calibration_for메서드가 제거되었습니다QuantumCircuit및DAGCircuit클래스에서 제거되었고add_calibration는QuantumCircuit. -
qiskit.circuit.classicalfunction모듈이 제거되었습니다. 이 모듈은 Python 의 최신 버전과 호환되지 않는tweedledum라이브러리에 종속되어 있습니다. 대안으로PhaseOracleGate및BitFlipOracleGate클래스를 사용하여 부울 표현식에서 회로를 생성할 수 있습니다. -
의 내부 표현은
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모델의 제거로 인해BackendSamplerV2과BackendEstimatorV2클래스는 더 이상backend입력 인수에BackendV1유형의 입력을 허용하지 않습니다. -
키스킷 v1.2 에서 사용되지 않는 프리미티브 V1 구현과 V1-exclusive 비-버전 유형 별칭이 제거되었습니다. 이러한 인터페이스는 V2 으로 대체되었습니다. 제거 대상에는 V1 인터페이스를 구현하는 다음 클래스가 포함됩니다:
Estimator를 V2 으로 변경합니다,StatevectorEstimatorSampler를 V2 으로 변경합니다,StatevectorSamplerBackendEstimator를 V2 으로 변경합니다,BackendEstimatorV2BackendSampler를 V2 으로 변경합니다,BackendSamplerV2
또한 다음과 같은 버전이 아닌 유형 별칭도 있습니다:
BaseEstimator의 별칭BaseEstimatorV1BaseSampler의 별칭BaseSamplerV1
이 제거는 이전 버전과의 호환성을 유지하기 위해 명시적으로 버전이 지정된
BaseEstimatorV1및BaseSamplerV1추상 인터페이스 정의나 관련 결과 및 작업 클래스에는 영향을 미치지 않습니다.BaseEstimator과 같이 버전이 지정되지 않은 V1-type 별칭을 사용하는 경우 버전이 지정된 유형으로 직접 바꿀 수 있습니다(BaseEstimatorV1).또한 다음과 같은 유틸리티 기능이 제거되었습니다. 이러한 함수는 프리미티브 V1 구현에서만 사용되었습니다:
init_circuit에서 회로를 초기화하려면Statevector대신QuantumCircuit.initialize()대신init_observable의 생성자를 사용하는 대신SparsePauliOp의 생성자를 대신 사용합니다.final_measurement_mapping를 사용하여QuantumCircuit.layout()및SparsePauliOp.apply_layout()를 사용하여 레이아웃에 대한 연산자를 조정합니다. 그렇지 않으면mthree.utils.final_measurement_mapping을 사용하세요. 자세한 내용은 Mthree 유틸리티 기능을 참조하세요.
공급자 업그레이드 안내
-
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모델의 구성 요소를 나타내는 데 사용되었습니다:BackendConfigurationBackendPropertiesBackendStatusQasmBackendConfigurationPulseBackendConfigurationUchannelLOGateConfigPulseDefaultsPulseQobjDefCommandGatePropertiesNduvJobStatus: 이 클래스는 더 널리 사용되는JobStatusPulseDefaults
-
BackendV2Converterclass:BackendV1에서BackendV2 -
convert_to_target함수: 기존 컴포넌트에서Target레거시BackendV1컴포넌트(예:BackendConfiguration또는BackendProperties)에서 인스턴스를 빌드하는 데 사용됩니다 -
BackendPropertyError및BackendConfigurationError: 제거된 클래스에 연결된 예외
-
-
백엔드는
BasicSimulator백엔드는 더 이상 기존 제어 흐름을 시뮬레이션할 수 없습니다. 제어 흐름 모델링을 위해.c_if()/.condition을 사용하는 것만 지원했지만, 이제 이 구조는 키스킷 데이터 모델에서 제거되었습니다. -
더 이상 사용되지 않는
BackendV1기반의 모든 가짜 백엔드 클래스는providers.fake_provider모듈에서 제거되었습니다. 이러한 클래스는 키스킷 1.2 이후 더 이상 사용되지 않으며, 사용되지 않는BackendV1워크플로우의 일부였습니다. 테스트에서의 사용은 사용자 정의 인스턴스를 생성할 수 있는GenericBackendV2클래스로 대체되었습니다BackendV2의 사용자 정의 인스턴스를 만들 수 있습니다BackendV2.run(). 제거하면 영향을 받습니다:-
기본 클래스:
FakeBackendFakePulseBackendFakeQasmBackend
-
특수 테스트 목적의 가짜 백엔드:
Fake1QFakeOpenPulse2QFakeOpenPulse3Q
-
레거시 가짜 백엔드:
Fake5QV1Fake20QV1Fake7QPulseV1Fake27QPulseV1Fake127QPulseV1
-
-
키스킷 v2.0.0 에서 펄스 제거의 일환으로 다음과 같은 방법이 제거되었습니다:
qiskit.providers.BackendV2.instruction_schedule_mapqiskit.providers.BackendV2.drive_channelqiskit.providers.BackendV2.measure_channelqiskit.providers.BackendV2.acquire_channelqiskit.providers.BackendV2.control_channel
-
키스킷에서 펄스 제거의 일환으로 v2.0.0 에서 펄스 지원이 제거되었습니다
GenericBackendV2. 여기에는 사용자 지정 보정(calibrate_instructions인수) 및 펄스 채널 속성(drive_channel,measure_channel,acquire_channel,control_channel)을 사용하여 백엔드를 초기화하는 기능이 포함됩니다. -
키스킷 v1.1.0 이후 더 이상 사용되지 않는 추상 베이스 클래스
Provider와ProviderV1를 제거했습니다. 이러한 인터페이스 정의에서 제공하는 추상화에는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 릴리스에서는symengine및sympy이 항상 설치되도록 보장되었습니다. 그러나 v2.x 부터는 더 이상 필수 요건이 아니며symengine을 사용하여 생성된 QPY 파일을 역직렬화하는 경우에만 필요할 수 있습니다. 이러한 QPY 페이로드를 구문 분석하려면symengine이 필요하며, 이는 QPY v10, v11, v12 의 형식 사양의 일부이기 때문입니다. 페이로드에 필요한 경우 호환되는symengine(0.11.0또는0.13.0)의 버전을 설치하는 것이 유일한 옵션입니다. 마찬가지로sympy은ParameterExpression인코딩에 사용되었습니다. -
최소 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,LieTrotter및SuzukiTrotter)에는 새로운 함수 서명이 있습니다. 이전 서명은 폴리 연산자와 시간 계수를 사용하여 진화 회로를 반환합니다: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로 변경하여 충실도 계산의 반올림 오류를 고려하고 다른 클래스와의 일관성을 위해CommutationAnalysis와TwoQubitWeylDecomposition. -
라우팅 플러그인 스테이지 이름
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,PadDynamicalDecoupling및ConstrainedReschedule로 대체되었습니다. 이 기능은 새로운 스케줄링 워크플로우가 기존 워크플로우를 대체한 후 키스킷 v1.1 에서 더 이상 사용되지 않습니다. -
target또는basis_gates세트가 지정되지 않은 경우, 트랜스파일러 패스는HighLevelSynthesis트랜스파일러 패스는 이전보다 적은 수의 래핑 레이어로 주석이 달린 연산을 사용하여 회로를 합성합니다(예를 들어, 다음에 의해 생성된 회로에서 발생합니다multiplier_cumulative_h18()). -
키워드 인수
property_set는 이제BasePassManager.run()로 예약되며, 하위 클래스가 프론트엔드 표현에서 내부 표현으로 변환할 때 전달되는kwarg로 사용할 수 없습니다. -
키스킷에서 번역 파이프라인에서 더 이상 사용되지 않는
BackendProperties객체의 다음 사용법이 제거되었다 2.0:backend_properties의 입력 인수를transpile()backend_properties의 입력 인수를PassManagerConfigbackend_properties의 입력 인수를generate_preset_pass_manager()backend_properties의 입력 인수를generate_routing_passmanager()backend_properties의 입력 인수를generate_translation_passmanager()backend_properties입력 인수Target.from_configuration()
또한 다음 패스는
target대신 다음 주소만 허용하도록 업데이트되었습니다:backend_prop의 입력 인수를DenseLayoutproperties의 입력 인수를VF2Layoutproperties및coupling_map입력 인수를VF2PostLayoutbackend_props의 입력 인수를UnitarySynthesis
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를 사용하여 연산 실행을 고전적으로 조건화해야 합니다. -
그리고
PadDelay및PadDynamicalDecoupling트랜스파일러 패스는 이제 생성 시 새 인수가 필요합니다.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_durationstiming_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인수가 제거되었습니다:- 그리고
generate_preset_pass_manager()및transpile()함수 - 메서드의
Target.from_configuration()메서드 - 클래스의 생성자는
PassManagerConfig클래스
보정 지원이 제거되었습니다:
calibration는 생성자에서 제거되었으며InstructionProperties생성자에서 제거되어 더 이상 해당 클래스의 프로퍼티가 아닙니다.has_calibration,get_calibration,instruction_schedule_map및update_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_transpiler이None에서-1로 변경되었습니다. 이 플래그는 트랜스파일러 패스를 구성하는 데만 사용되었기 때문에 이 변경이 이루어졌습니다VF2PostLayout트랜스파일러 패스에만 사용되며, 해당 패스의 경우 무작위화는 일반적으로 성능을 저하시키고 바람직하지 않기 때문입니다. 이전 기본값에 의존하는 경우seed_transpiler=None인수를 명시적으로 설정하여 이 동작을 복원할 수 있습니다. 이 매개변수에 대한 시드 값을 명시적으로 설정한 경우에는 동작이 변경되지 않습니다.
시각화 업그레이드 안내
-
모든 회로 서랍의
idle_wires매개변수가 새로운 옵션인"auto"으로 확장되어 이제 기본 동작이 됩니다. 그래도 지침 없이 와이어를 표시하려면idle_wires=True을 명시적으로 설정하세요."auto"로 설정하면 동작은 다음과 같습니다:- 회로에 정의된
.layout속성이 있는 경우idle_wires은 자동으로False(유휴 전선 숨기기)로 설정됩니다 - 그렇지 않으면
idle_wires은True(이전 기본값과 같이 모든 와이어 표시)로 유지됩니다
다음 예는
idle_wires="auto"을 사용하여 레이아웃이 표시되지 않은 회로를 보여줍니다:qr_0: ──────── ┌───┐┌─┐ qr_1: ┤ H ├┤M├ └───┘└╥┘ cr_0: ══════╬═ ║ cr_1: ══════╩═레이아웃이 적용되면
idle_wires="auto"은idle_wires을False으로 설정하여 유휴 와이어를 숨깁니다:┌───┐┌─┐ 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 릴리스에서는symengine및sympy설치가 항상 보장되었지만 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_function및deprecate_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백엔드와의 상호 작용에는 더 이상 필요하지 않습니다. 이 제거는 다음 클래스에 영향을 줍니다:QobjExperimentHeaderQobjHeaderQasmQobjQasmQobjInstructionQasmQobjExperimentConfigQasmQobjExperimentQasmQobjConfigQasmExperimentCalibrationsGateCalibrationPulseQobjPulseQobjInstructionPulseQobjExperimentConfigPulseQobjExperimentPulseQobjConfigQobjMeasurementOptionPulseLibraryItem
-
이전에
qobj/utils.py에 정의되었던MeasLevel및MeasReturnType클래스는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.scheduler의sequence및schedule_circuit함수와ScheduleConfig클래스가 제거되었습니다. -
qiskit.result.mitigation모듈은 키스킷 v1.3 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 제거 대상에는LocalReadoutMitigator및CorrelatedReadoutMitigator클래스와 관련 유틸리티가 포함됩니다. 해당 기능이`mthree애드온으로 대체되었기 때문에 키스킷에는 대체 경로가 없습니다. <https://github.com/Qiskit/qiskit-addon-mthree> `__
회로 사용 중단
-
더 이상 사용되지 않는
QuantumCircuit.duration속성은 원래 계획대로 이번 릴리스에서 제거되지 않았습니다. 대신 키스킷 v3.0.0 릴리즈의 일부로 제거될 예정입니다. 이 기능은 대신 사용해야 하는QuantumCircuit.estimate_duration()메서드로 대체되었으므로 대신 사용해야 합니다. -
에 대한 더 이상 사용되지 않는 튜플형 인터페이스는
CircuitInstruction에 대한 더 이상 사용되지 않는 튜플형 인터페이스는 원래 계획대로 이번 릴리스에서 제거되지 않았습니다. 대신 키스킷 v3.0.0 에서 제거됩니다. 대신operation,qubits및clbits네임드 어트리뷰트를 사용합니다. -
다중 제어 다중 대상 회로 클래스
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. 근본적인 문제는 다음과 같은 원인으로 인해 발생했습니다RemoveIdentityEquivalent및CommutationAnalysis(그리고 더 나아가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.2513478 수정.
-
의 버그를 수정했습니다
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번을 참조하세요.