키스킷 SDK 1.1 릴리즈 노트
1.1.2
Prelude
키스킷 1.1.2 은 1.1 시리즈의 사소한 버그 수정 릴리스입니다.
버그 수정
-
의 버그를 수정했습니다
BitArray.from_counts()및BitArray.from_samples(). 이전에는 0만 포함된 데이터와 선택적 인수num_bits에 대한 값이 없는 경우 오류가 발생했습니다. 이제 그들은BitArray와BitArray.num_bits를 1로 설정합니다. -
에서 누락된 데코레이터를 수정했습니다
C3SXGate에서 데코레이터가 누락되어Gate.to_matrix()가 호출되면 실패하도록 수정했습니다. 이제 게이트 매트릭스가 예상대로 반환됩니다. -
누락된 클리포드 게이트를
CollectCliffords트랜스파일러 패스에 누락된 클리포드 게이트를 추가했습니다. 특히 게이트ECRGate,DCXGate,iSWAPGate,SXGate및SXdgGate를 이 트랜스파일러 패스에 추가했습니다. -
이제
QuantumCircuit.parameters속성은 이제 파라메트릭 회로에서QuantumCircuit.copy_empty_like()를 사용할 때 속성이 올바르게 비워집니다. 이전에는 내부 캐시가 무효화되지 않고 복사되었습니다. 수정 #12617. -
기존 근사값을 로드할 때
SolovayKitaev트랜스파일러 패스를 기존.npy파일에서 기본 근사치를 로드할 때 수정합니다. 이전에는 게이트 취소 등으로 인해 추가 감소가 가능한 저장된 근사값을 로드하면 런타임 오류가 발생할 수 있었습니다. 또한 저장-재로드 절차 중에 U(2) 게이트 제품 및 SO(3) 표현의 글로벌 위상차가 손실되었습니다. 수정 Qiskit/qiskit#12576. -
관련 문제를 수정했습니다
dag_drawer()및DAGCircuit.draw()인스턴스를 시각화하려고 할 때DAGCircuit인스턴스를 시각화하려고 할 때Var와이어가 포함된 인스턴스를 시각화하려고 할 때 발생하는 문제를 수정했습니다. 비주얼라이저가 이 작업을 수행하려고 할 때 예외가 발생하는데, 이를 수정하여 예상되는 시각화가 생성되도록 했습니다. -
생성자
GenericBackendV2는 이전에는 백엔드 크기에 따라 할당할 수 없는 베이스 게이트를 허용했기 때문에 잘못된 백엔드를 구성할 수 있었습니다. 예를 들어, 단일 큐비트가 있는 백엔드는 이전에는 2큐비트 게이트가 있는 베이시스를 받아들일 수 있었습니다. -
OpenQASM 2 파서(
qiskit.qasm2)는 이제 64비트 정수에 맞지 않는 정수가 포함된 조건문을 처리할 수 있습니다. 수정 #12773. -
이전에는
DAGCircuit.replace_block_with_op()는m큐비트 블록에n-큐비트 연산을 허용하여 DAG를 유효하지 않은 상태로 유지했습니다. 이 동작이 수정되었으며, 이제 이 동작을 시도하면DAGCircuitError가 발생합니다.
1.1.1
Prelude
키스킷 1.1.1 은 1.1 시리즈의 사소한 버그 수정 릴리스입니다.
버그 수정
-
의 버그를 수정했습니다
Isometry의 버그를 수정하여 불필요한 어설션으로 인해UnitaryGate.control()에 오류를 일으켰던UnitaryGate가 두 큐비트보다 많을 때 오류가 발생하던 버그를 수정했습니다. -
QuantumCircuit.depth()은 이제 피연산자가 없는 연산, 예를 들어GlobalPhaseGate. -
QuantumCircuit.depth()는 이제 실시간 표현식에 사용된 변수와 클릿을 깊이 계산의 일부로 계산합니다. -
인수를 사용하여 draw 함수를 호출할 때 펄스 스케줄을 그리지 않던
qiskit.visualization.pulse_v2.interface.draw()의 버그를 수정했습니다BackendV2인수로 호출할 때 펄스 스케줄을 그리지 않는 버그를 수정했습니다. V2 백엔드는 하드웨어 채널 주파수를 보고하지 않으므로 생성된 도면에는 '주파수 없음'이 표시됩니다 을 각 채널 라벨 아래에 표시합니다. -
패스는
VF2Layout패스는 연결 제약 조건이 없는Target인스턴스가 제공되면 예외를 발생시킵니다. Aer 0.13 의 타겟이 이에 해당합니다. 이 문제가 이제 해결되었습니다. -
ParameterExpressionPython 의 내장 숫자 유형(예:float및int)의 인스턴스와 동일하게 비교되는 완전 바인딩 인스턴스도 다른 인스턴스와 일치하는 해시 값을 갖도록 업데이트되었습니다. 이 변경으로 이러한 유형을 사전 키로 상호 교환하여 사용할 수 있습니다. 12488번을 참조하세요. -
가져온 OpenQASM 2 프로그램의 사용자 정의 게이트(
gate문에서 비롯된 게이트)에는 이제Gate.to_matrix()구현을 갖게 됩니다. 이전에는 행렬 정의가 없었기 때문에 OpenQASM 2를 통한 라운드 트립은 불필요하게 게이트 행렬을 도출하는 기능을 잃을 수 있었습니다. 하지만 행렬은 다음과 같이 내부 게이트 정의의 행렬을 재귀적으로 찾아서 계산한다는 점에 유의하세요Operator가 하는 것처럼 재귀적으로 내부 게이트 정의 행렬을 찾아서 계산하므로 왕복 전보다 성능이 떨어질 수 있습니다. -
Target.has_calibration()는 인스트럭션 속성에None를 사용하여 대상에 추가된 인스트럭션에 대해 예외를 발생시키지 않도록 업데이트되었습니다. 수정 #12525.
1.1.0
Prelude
키스킷 1.1.0 릴리스는 수많은 새로운 기능과 버그 수정이 포함된 마이너 기능 릴리스입니다. 이번 릴리스의 주요 내용은 다음과 같습니다:
입력된 클래식 변수에 대한 지원이 키스킷의
QuantumCircuit. 이러한 클래식 변수는 입력으로 지정하거나 범위가 지정된 변수로QuantumCircuit에 입력 또는 범위 변수로 지정할 수 있으며, 예를 들어 큐비트 측정의 출력을 저장하거나 제어 흐름 연산을 대상으로 합니다. 향후 게이트 파라미터 또는 출력 변수 설정 등에 대한 지원이 추가될 예정입니다.패스에서 트랜스파일러가 내부적으로 사용하는 기본 두 가지 큐비트 합성 메서드인
UnitarySynthesis패스에서 트랜스파일러가 내부적으로 사용하는 두 가지 기본 쿼비트 합성 메서드가 Rust에서 다시 구현되었습니다. 이렇게 하면 두 큐비트 유니타리 행렬을 분해할 때 런타임 속도가 크게 향상됩니다. 그 결과, 최적화 레벨 3을 적용한 트랜스파일레이션의 런타임이 크게 개선되었습니다UnitarySynthesis을 실행하면 런타임 오버헤드가 크게 발생했습니다. 이 릴리스는 또한 이러한 런타임 성능 개선으로 인해UnitarySynthesis을 최적화 레벨 2의 최적화 단계의 일부로 시작하는데, 이러한 런타임 성능 개선이 이루어졌기 때문입니다.또한
Isometry에 사용된 숫자 메서드가 Rust로 이전되어 특히 제어된 단일 게이트 합성에서 런타임 속도를 크게 향상시킬 수 있습니다. 다중 제어에 대한 분해XGate및PhaseGate의 분해가 개선되어 합성에 사용되는 게이트 수가 두 배 이상 감소했습니다.많은 경우 트랜스파일링된 양자 회로의 크기를 줄이면서 런타임 속도를 크게 향상시키는 새로운 트랜스파일러 패스가 키스킷에 도입되었습니다. 구체적으로
ElidePermutations와StarPreRouting는 라우팅 출력 품질과 런타임에 상당한 영향을 미치는 것으로 입증되었으며RemoveFinalReset리셋을 포함하는 양자 회로를 개선할 수 있습니다.기본 패스 관리자는 새로 도입된 트랜스파일러 패스로 확장하여 개선되었습니다. 특히
generate_preset_pass_manager의 최적화 레벨 2 사전 설정 패스 관리자(내부에서 사용)는transpile()가 향후 릴리스에서 기본 패스 관리자로 사용할 수 있도록 런타임과 최적화 노력 간의 균형을 더 잘 맞추도록 리팩토링되었습니다. 이번 릴리스에서는 레벨 2를 사용하도록 기본값이 변경되지는 않았지만 일반적으로 레벨 1 또는 3을 사용하는 것보다 더 나은 선택입니다.새로운 일반 프리미티브 V2 구현이 추가되었습니다,
BackendEstimatorV2와BackendSamplerV2를 추가하여 기존의 전체 상태벡터 기반 구현을 보완했습니다.플랫폼 지원 변경: Python 3.8 은 키스킷 1.1.0 에서 더 이상 지원되지 않으며 1.3.0, arm64 macOS 은 티어 1 지원으로 승격되었습니다.
회로 기능
-
방법
QuantumCircuit.power(),Gate.power()메서드뿐만 아니라 하위 클래스의 하위 클래스에서 유사한 메서드인Gate(예SGate)에는 모두 새로운 인자annotated가 추가되어 게이트나 회로에 전원을 인가할 때AnnotatedOperation객체를 반환하는 데 사용됩니다. 기본값False은 기존 동작에 해당합니다. 또한 명시적으로 정의된power메서드가 있는 표준 게이트의 경우annotated인수는 효과가 없습니다. 예를 들어SGate().power(1.5, annotated=False)와SGate().power(1.5, annotated=True)는 모두PhaseGate를 반환합니다. 명시적으로 정의된 전원 메서드가 없는 게이트의 경우annotated값의 차이가 나타납니다.False의 값은 이전과 마찬가지로UnitaryGate를 반환하고,True의 값은 "파워 수정자"로 수정된 명령을 나타내는AnnotatedOperation를 반환하며, 이는 "전원 수정자"로 수정된 명령어를 나타냅니다. -
에 새로운
ctrl_state인수를 추가했습니다QuantumCircuit.mcp()및MCPhaseGate.메서드
QuantumCircuit.mcp()메서드와MCPhaseGate클래스가ctrl_state매개변수를 포함하도록 업데이트되었습니다. 이 기능을 통해 사용자는 다중 제어 위상 게이트의 제어 상태를 지정할 수 있습니다. 이 매개변수는 정수 값 또는 비트 문자열을 사용할 수 있으며, 제공하지 않으면 기본적으로 '1' 상태를 제어합니다.from qiskit import QuantumCircuit qc = QuantumCircuit(4) qc.mcp(0.2,[0,1,2],3,ctrl_state=2) -
에 새로운
ctrl_state인수를 추가했습니다QuantumCircuit.mcx().양자 회로 라이브러리의
QuantumCircuit.mcx()메서드가 개선되어 사용자가 다중 제어 X 게이트의 제어 상태를 지정할 수 있는 ctrl_state 파라미터를 포함할 수 있습니다. 이 매개변수는 십진수 값 또는 비트 문자열을 사용할 수 있으며, 제공하지 않으면 기본적으로 '1' 상태를 제어합니다.from qiskit import QuantumCircuit qc = QuantumCircuit(3, 3) qc.mcx([0, 1], 2, ctrl_state="00") -
A
QuantumCircuit는 이제 입력된 클래식 변수를 포함할 수 있습니다:from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister from qiskit.circuit.classical import expr, types qr = QuantumRegister(2, "q") cr = ClassicalRegister(2, "c") qc = QuantumCircuit(qr, cr) # Add two input variables to the circuit with different types. a = qc.add_input("a", types.Bool()) mask = qc.add_input("mask", types.Uint(2)) # Test whether the input variable was true at runtime. with qc.if_test(a) as else_: qc.x(0) with else_: qc.h(0) qc.cx(0, 1) qc.measure(qr, cr) # Add a typed variable manually, initialized to the same value as the classical register. b = qc.add_var("b", expr.lift(cr)) qc.reset([0, 1]) qc.h(0) qc.cx(0, 1) qc.measure(qr, cr) # Store some calculated value into the `b` variable. qc.store(b, expr.bit_and(b, cr)) # Test whether we had equality, up to a mask. with qc.if_test(expr.equal(expr.bit_and(b, mask), mask)): qc.x(0)이러한 변수는 회로에 대한 입력으로 지정하거나 범위가 지정된 변수로 지정할 수 있습니다. 회로 객체는 아직 유형화된 클래식 변수 출력 표현을 지원하지 않지만, 하드웨어와 결과 인터페이스가 이를 지원할 수 있는 위치에 도달하면 나중에 추가될 예정입니다. 내부 범위의 블록을 나타내는 회로는 외부 범위의 변수를 캡처할 수도 있습니다.
변수는 이제 임의의 유형을 포함할 수 있는
Var노드로, 이제 임의의 유형을 포함할 수 있으며 회로에 추가될 때 해당 라이브 범위 내의 고유한 메모리 위치를 나타냅니다. 이들은 다음을 사용하여 회로로 구성할 수 있습니다QuantumCircuit.add_var()와QuantumCircuit.add_input()를 사용하여 회로로 구성하거나Var.new()를 사용하여 더 낮은 레벨에서 구성할 수 있습니다.변수는 수동으로 저장할 수 있습니다
Store명령어와 해당 회로 메서드QuantumCircuit.store(). 여기에는 다음 주소로Clbit및ClassicalRegister인스턴스에 쓰기 및Var노드에 쓰기 및 인스턴스 래핑이 포함됩니다.변수는 기존 표현식(
qiskit.circuit.classical.expr)가 유효한 곳이면 어디에서나 사용할 수 있습니다. 현재는 제어 흐름 연산이 대상 표현식이지만, 향후 유형 및 표현식 시스템이 확장됨에 따라 게이트 매개변수로 확장할 계획입니다.이러한 변수와 관련 데이터 모델에 대한 자세한 내용은 실시간 클래식 계산을 참조하세요.
이는 트랜스파일러 전체에서 QPY 직렬화(
qiskit.qpy), OpenQASM 3 내보내기(qiskit.qasm3), 회로 시각화기를 통해 초기 지원됩니다(QuantumCircuit.draw()).참고새로운 클래식 변수와 스토리지는 하드웨어와 시뮬레이터 백엔드에서 지원되기까지 다소 시간이 걸릴 것입니다. 프리미티브 인터페이스(
qiskit.primitives)에서는 지원되지 않지만, 인터페이스가 발전함에 따라 해당 인터페이스에 정보를 제공할 가능성이 높습니다. -
고전적인 실시간 표현식 모듈
qiskit.circuit.classical은 이제 부호 없는 정수와 비트 라이크(예를 들어ClassicalRegister). 예를 들어, 이제 한 레지스터를 다른 레지스터의 비트 시프트와 비교할 수 있습니다:from qiskit.circuit import QuantumCircuit, ClassicalRegister from qiskit.circuit.classical import expr cr1 = ClassicalRegister(4, "cr1") cr2 = ClassicalRegister(4, "cr2") qc = QuantumCircuit(cr1, cr2) with qc.if_test(expr.equal(cr1, expr.shift_left(cr2, 2))): pass키스킷은 또한 레지스터에 동적으로 색인되는 조건을 나타낼 수도 있습니다:
with qc.if_test(expr.index(cr1, cr2)): pass -
의 구성 성능
NLocal및 그 파생된 회로 라이브러리 서브 클래스(예EfficientSU2및RealAmplitudes)는 회전 및/또는 얽힘 하위 블록이 단일 키스킷 표준 라이브러리 게이트의 간단한 적용일 때 크게 향상되었습니다. 이러한 회로는 느리게 구성되므로 클래스를 인스턴스화할 때 즉시 개선된 것을 볼 수 있는 것이 아니라 내부 구조에 처음 접근할 때 개선된 것을 볼 수 있습니다. 성능 향상 속도는 10배 정도 빨라졌습니다. -
QuantumCircuit.append()이제copy키워드 인수가 있으며 기본값은True입니다. 런타임 파라미터(ParameterExpression)가 있는 명령어가 회로에 추가되면 기본적으로 회로는 항상 명령어의 복사본을 생성하므로, 만약QuantumCircuit.assign_parameters()가 명령어를 제자리에서 변경하려고 시도해도 동일한 명령어에 대한 다른 참조에는 영향을 미치지 않습니다. 이제copy=False을 설정하면 이를 무시할 수 있으므로 다른 위치에서 지침이 사용되지 않을 경우 복사 불이익을 피할 수 있습니다. -
QuantumCircuit.compose()이제copy키워드 인수가 있으며 기본값은True입니다. 기본적으로compose()는 모든 명령을 복사하여 한 회로의 돌연변이가 다른 회로에 영향을 미치지 않도록 합니다.copy=False이면 다른 회로의 명령어가 새 회로에서 직접 소유하게 되며, 이 경우 해당 명령어를 제자리에서 변경해야 할 수 있습니다. 이 경우 다른 회로는 나중에 사용해서는 안 됩니다. -
회로의 건설 시간이
QuantumVolume회로의 건설 시간이 10x 정도로 크게 개선되었습니다. 내부 SU4 게이트는 이제 생성 중에 더 많은 비트의 무작위성을 사용하므로 특히 폭과 깊이가 큰 경우 더욱 대표적인 볼륨 회로로 이어집니다. -
QuantumVolume이제flatten키워드 인수가 있습니다. 기본값은False이며, 구성된 회로에는 실제 볼륨 구조를 포함하는 단일 인스트럭션이 포함되어 있습니다.True으로 설정하면 회로에 직접 체적 SU4 행렬이 생깁니다. -
UnitaryGate이제 선택적num_qubits인수를 허용합니다. 이는 큐비트 수 추론을 건너뛰는 유일한 효과로, 많은 게이트를 구성할 때 성능에 도움이 될 수 있습니다. -
QuantumCircuit에는 수동으로 작업하고 검사하는 몇 가지 새로운 메서드가 있습니다Var변수를 검사할 수 있습니다.이 모든 것에 대한 자세한 내용은 실시간 입력 클래식 데이터로 작업하기를 참조하세요.
새 메소드는 다음과 같습니다.
add_var()add_input()add_capture()add_uninitialized_var()get_var()has_var()iter_vars()iter_declared_vars()iter_captured_vars()iter_input_vars()store()
또한 이러한 변수를 둘러싼 몇 가지 새로운 동적 속성을
QuantumCircuit에 몇 가지 새로운 동적 속성이 추가되었습니다: -
ControlFlowOp와 그 서브클래스에는 이제iter_captured_vars()메서드가 있으며, 이 메서드는 바로 앞 블록에서 캡처된 고유 변수에 대한 이터레이터를 반환합니다. -
DAGCircuit에는 수동으로 작업하고 검사하는 몇 가지 새로운 메서드가 있습니다Var변수를 검사할 수 있습니다. 이들은 대체로QuantumCircuit와 거의 동일하지만DAGCircuit메서드는 이미 정의된 객체를 사용한 프로그래밍 방식 액세스에 최적화되어 있고QuantumCircuit메서드는 대화형 인간 사용에 더 중점을 두고 있습니다.새 메소드는 다음과 같습니다.
add_input_var()add_captured_var()add_declared_var()has_var()iter_vars()iter_declared_vars()iter_captured_vars()iter_input_vars()
새로운 공개 속성도 있습니다:
-
DAGCircuit.wires에도 이제 모든Var수동 변수도 회로에 포함할 수 있게 됩니다. -
새로운 메서드
Var.new()메서드가 추가되어 메모리를 소유하는 실시간 클래식 변수를 수동으로 구성할 수 있습니다. -
QuantumCircuit.compose()에는 실시간 클래식 변수를 더 잘 지원하기 위해var_remap및inline_captures두 개의 필요 키워드 인수가 있습니다.var_remap를 사용하여 회로 인수의Var노드를 다시 작성하는 데 사용할 수 있으며, 명령어가 기본 회로에 인라인 처리됩니다. 이는 이름 충돌을 피하는 데 사용할 수 있습니다.inline_captures를True(기본값은False)로 설정하여 인수 회로에서 추적되는 모든Var인자 회로에서 "캡처"로 추적된 모든 노드를 기본 회로의 동일한Var노드로 연결하여 변수를 다시 선언하지 않아도 됩니다. 이것은QuantumCircuit.copy_empty_like()의vars_mode="captures"처리와 함께 사용하여 변수를 포함하는 회로를 레이어별로 구축할 수 있습니다. -
DAGCircuit.compose()에는 새로운 키워드 인자inline_captures가 있으며,True로 설정하여 인자 회로의 "캡처된"Var노드를 다시 선언하지 않고 인자 회로의 노드를 기본 회로에 인라인할 수 있습니다.vars_mode="captures"옵션과 함께 여러 메서드의DAGCircuit메서드와 함께 사용하면 동일한 변수에 대해 작동하는 DAG를 결합하는 데 사용할 수 있습니다. -
QuantumCircuit.copy_empty_like()와DAGCircuit.copy_empty_like()에는 새로운 키워드 인자vars_mode가 있어 메모리를 소유하는 모든Var노드가 출력에서 추적되는 방식을 제어합니다. 기본적으로("alike"), 변수는 소스와 동일한 입력/캡쳐/로컬 모드로 선언됩니다."captures"로 설정하여 모든 변수를 캡처로 변환하거나(compose()) 또는"drop"으로 설정하여 제거할 수 있습니다. -
메소드에 새로운
vars_mode키워드 인수가 추가되었습니다DAGCircuit메서드에 추가되었습니다:와 같은 의미를 갖는
copy_empty_like(). -
회로 라이브러리의 모든 "표준 게이트"(
qiskit.circuit.library)의 얽힘 연산에 대해 이제 문자열 이름으로 지정할 수 있습니다TwoLocal회로의 얽힘 연산에 대해RealAmplitudes및EfficientSU2.
기본형 기능
-
구현
BackendEstimatorV2의 구현BaseEstimatorV2구현이 추가되었습니다. 이 추정기는 다음을 지원합니다BackendV1및BackendV2.import numpy as np from qiskit import transpile from qiskit.circuit.library import IQP from qiskit.primitives import BackendEstimatorV2 from qiskit.providers.fake_provider import Fake7QPulseV1 from qiskit.quantum_info import SparsePauliOp, random_hermitian backend = Fake7QPulseV1() estimator = BackendEstimatorV2(backend=backend) n_qubits = 5 mat = np.real(random_hermitian(n_qubits, seed=1234)) circuit = IQP(mat) observable = SparsePauliOp("Z" * n_qubits) isa_circuit = transpile(circuit, backend=backend, optimization_level=1) isa_observable = observable.apply_layout(isa_circuit.layout) job = estimator.run([(isa_circuit, isa_observable)], precision=0.01) result = job.result() print(f"> Expectation value: {result[0].data.evs}") print(f"> Standard error: {result[0].data.stds}") print(f"> Metadata: {result[0].metadata}") -
구현
BackendSamplerV2의 구현BaseSamplerV2구현이 추가되었습니다. 이 샘플러는 다음을 지원합니다BackendV1와BackendV2를 지원하여memory옵션으로 비트스트링을 계산할 수 있습니다.import numpy as np from qiskit import transpile from qiskit.circuit.library import IQP from qiskit.primitives import BackendSamplerV2 from qiskit.providers.fake_provider import Fake7QPulseV1 from qiskit.quantum_info import random_hermitian backend = Fake7QPulseV1() sampler = BackendSamplerV2(backend=backend) n_qubits = 5 mat = np.real(random_hermitian(n_qubits, seed=1234)) circuit = IQP(mat) circuit.measure_all() isa_circuit = transpile(circuit, backend=backend, optimization_level=1) job = sampler.run([isa_circuit], shots=100) result = job.result() print(f"> bitstrings: {result[0].data.meas.get_bitstrings()}") print(f"> counts: {result[0].data.meas.get_counts()}") print(f"> Metadata: {result[0].metadata}") -
다양한 축을 따라 여러
BitArray오브젝트를 여러 축에 결합하는 메서드를 추가했습니다.concatenate(): 배열의 기존 축을 따라 배열을 조인합니다.concatenate_bits(): 비트 축을 따라 배열을 조인합니다.concatenate_shots()샷 축을 따라 배열을 조인합니다.
ba = BitArray.from_samples(['00', '11']) print(ba) # BitArray(<shape=(), num_shots=2, num_bits=2>) # reshape the bit array because `concatenate` requires an axis. ba_ = ba.reshape(1, 2) print(ba_) # BitArray(<shape=(1,), num_shots=2, num_bits=2>) ba2 = BitArray.concatenate([ba_, ba_]) print(ba2.get_bitstrings()) # ['00', '11', '00', '11'] # `concatenate_bits` and `concatenates_shots` do not require any axis. ba3 = BitArray.concatenate_bits([ba, ba]) print(ba3.get_bitstrings()) # ['0000', '1111'] ba4 = BitArray.concatenate_shots([ba, ba]) print(ba4.get_bitstrings()) # ['00', '11', '00', '11'] -
객체의 하위 집합을 생성하는 메서드가 추가되었습니다
BitArray객체의 하위 집합을 생성하는 메서드를 추가했습니다.__getitem__()배열의 기존 축을 따라 배열을 슬라이스합니다.slice_bits(): 비트 축을 따라 배열을 슬라이스합니다.slice_shots()샷 축을 따라 배열을 슬라이스합니다.
ba = BitArray.from_samples(['0000', '0001', '0010', '0011'], 4) print(ba) # BitArray(<shape=(), num_shots=4, num_bits=4>) print(ba.get_bitstrings()) # ['0000', '0001', '0010', '0011'] ba2 = ba.reshape(2, 2) print(ba2) # BitArray(<shape=(2,), num_shots=2, num_bits=2>) print(ba2[0].get_bitstrings()) # ['0000', '0001'] print(ba2[1].get_bitstrings()) # ['0010', '0011'] ba3 = ba.slice_bits([0, 2]) print(ba3.get_bitstrings()) # ['00', '01', '00', '01'] ba4 = ba.slice_shots([0, 2]) print(ba3.get_bitstrings()) # ['0000', '0010'] -
메서드 추가
transpose()를 전치하는 메서드BitArray.ba = BitArray.from_samples(['00', '11']).reshape(2, 1, 1) print(ba) # BitArray(<shape=(2, 1), num_shots=1, num_bits=2>) print(ba.transpose()) # BitArray(<shape=(1, 2), num_shots=1, num_bits=2>) -
대각선 연산자의 기대값을 계산하는 메서드
expectation_values()메서드를 추가하여 대각선 연산자의 기대값을 계산합니다.ba = BitArray.from_samples(['01', '11']) print(ba.expectation_values(["IZ", "ZI", "01"])) # [-1. 0. 0.5] -
DataBin이제Shaped프로토콜을 충족합니다. 즉, 이제 모든DataBin인스턴스에는 이제 추가 속성이 있습니다생성자에게 모양을 전달할 수 있습니다.
-
에 매핑과 유사한 기능을 추가했습니다
DataBin, 즉__getitem__,__contains__,__iter__,keys(),values()및items().from qiskit import QuantumCircuit from qiskit.primitives import StatevectorSampler circuit = QuantumCircuit(1) circuit.h(0) circuit.measure_all() sampler = StatevectorSampler() result = sampler.run([circuit]).result() databin = result[0].data for creg, arr in databin.items(): print(creg, arr) for creg in databin: print(creg, databin[creg]) -
서브클래스
SamplerPubResult의 서브클래스PubResult의 서브클래스가 추가되었습니다BaseSamplerV2구현이 반환할 수 있습니다. 이 새로운 서브클래스에 추가된 주요 기능은join_data()의 내용( 하위 집합)을 하나의 객체로 결합하는 함수입니다data의 내용을 하나의 객체로 결합합니다. 이를 통해 다음과 같은 패턴을 사용할 수 있습니다:job_result = sampler.run([pub1, pub2, pub3], shots=123).result() # assuming all returned data entries are BitArrays counts1 = job_result[0].join_data().get_counts() bistrings2 = job_result[1].join_data().get_bitstrings() array3 = job_result[2].join_data().array
제공자 기능
- 파이썬 기반 시뮬레이터에 포함된
BasicSimulator에 포함된 파이썬 기반 시뮬레이터basic_provider에 포함된 파이썬 기반 시뮬레이터는 이제 최대 3 큐비트까지 모든 표준 게이트 실행을 지원합니다qiskit.circuit.library.
펄스 기능
-
이제 펄스에 매개변수를 할당할 수 있습니다
Schedule및ScheduleBlock객체에 매개변수 이름을 문자열로 지정하여 매개변수를 할당할 수 있습니다. 매개변수 이름은 모든 매개변수에 값을 할당하는 데 사용할 수 있습니다Schedule또는ScheduleBlock안에 있는 동일한 이름을 가진 모든 매개변수에 값을 할당할 수 있습니다. 또한 매개변수 이름인ParameterVector를 사용하여 벡터의 모든 값을 동시에 할당할 수 있습니다(따라서 값 목록은 벡터의 길이와 일치해야 합니다). -
assign_parameters의Schedule와ScheduleBlock의 메서드는 이제 매개변수 값 목록에ParameterVector를 매개변수 값 목록에 동시에 할당할 수 있게 되었습니다Parameter인스턴스를 할당할 수 있습니다.
OpenQASM 기능
- OpenQASM 3 익스포터는 회로의 수동 저장
Var노드를 지원합니다.
QPY 기능
- QPY(
qiskit.qpy) 형식 버전 12가 추가되었으며, 메모리 소유Var변수를 지원합니다. 변경된 형식에 대한 자세한 내용은 버전 12를 참조하세요.
양자 정보 특성
-
새로운
apply_layout()메서드에 해당하는apply_layout(). 이 메서드는 트랜스파일러에서TranspileLayout트랜스파일러의 레이아웃을Pauli옵저버블에 레이아웃을 적용하는 데 사용됩니다. 이렇게 하면BaseEstimator/BaseEstimatorV2구현과 입력이 타입이Pauli. 예를 들어,from qiskit.circuit.library import RealAmplitudes from qiskit.primitives import BackendEstimatorV2 from qiskit.providers.fake_provider import GenericBackendV2 from qiskit.quantum_info import Pauli from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager psi = RealAmplitudes(num_qubits=2, reps=2) H1 = Pauli("XI") backend = GenericBackendV2(num_qubits=7) estimator = BackendEstimatorV2(backend=backend) thetas = [0, 1, 1, 2, 3, 5] pm = generate_preset_pass_manager(optimization_level=3, backend=backend) transpiled_psi = pm.run(psi) permuted_op = H1.apply_layout(transpiled_psi.layout) res = estimator.run([(transpiled_psi, permuted_op, thetas)]).result()로 전달되기 전에 입력 회로가 로컬에서 트랜스파일링되는 경우
run()로 전달됩니다. 트랜스필레이션은 원래 회로를 2 큐비트에서 7 큐비트(backend의 크기)로 확장하고 그 레이아웃을 퍼뮤트한 다음H1에apply_layout()를 사용하여pm.run()에 의해 수행된 변환을 반영합니다. -
추가
PauliList.noncommutation_graph()및SparsePauliOp.noncommutation_graph()메서드를 추가하여 비교차 그래프의 구성을 노출하고 측정 연산자 그룹화 문제를 그래프 색칠 문제로 재구성합니다. 이를 통해 사용자는 이러한 그래프로 직접 작업할 수 있습니다(예: 색 지정 알고리즘을 탐색하기 위해SparsePauliOp.group_commuting(). -
의 성능이
SparsePauliOp.to_matrix()의 성능이 밀집형과 희소형 모두에서 크게 향상되었습니다. 이제 기본적으로 두 가지 모두RAYON_NUM_THREADS환경 변수에 따라 시스템에서 사용 가능한 스레드 병렬 처리를 활용합니다. 새로운force_serial부울 인수를 사용하여 일시적으로 직렬 실행을 강제할 수 있습니다to_matrix().
합성 기능
-
합성용
KMSSynthesisLinearFunction객체 합성을 위한LinearFunction객체 합성 플러그인은 이제 두 가지 추가 옵션use_inverted과use_transposed을 허용합니다. 이 옵션은 기본 합성 알고리즘이 실행되는 매트릭스를 반전 및/또는 전치하여 수정한 다음 합성된 회로를 적절히 조정합니다. 이러한 옵션을 변경하면 일반적으로 다른 합성 회로를 얻을 수 있으며 경우에 따라 기본값보다 더 나은 결과를 얻을 수 있습니다. -
합성용
PMHSynthesisLinearFunction합성용 플러그인LinearFunction객체를 합성하는 플러그인은 이제 몇 가지 추가 옵션을 허용합니다.section_size옵션은 기본 합성 메서드에 전달됩니다.use_inverted및use_transposed옵션은 기본 합성 알고리즘이 실행되는 행렬을 반전 및/또는 전치하여 수정한 다음 합성 회로를 적절히 조정합니다. 이러한 옵션을 변경하면 일반적으로 다른 합성 회로를 얻을 수 있으며 경우에 따라 기본값보다 더 나은 결과를 얻을 수 있습니다. -
에 새 인수
use_dag를 추가했습니다TwoQubitBasisDecomposer.__call__()및XXDecomposer.__call__()메서드에 새로운 인수를 추가했습니다. 이 인수는 호출 시DAGCircuit를 호출할 때 반환되는TwoQubitBasisDecomposer또는XXDecomposer인스턴스를 호출할 때 기본값QuantumCircuit. 예를 들어,from qiskit.circuit.library import CXGate from qiskit.quantum_info import random_unitary from qiskit.synthesis import TwoQubitBasisDecomposer decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="PSX") decomposer(random_unitary(4), use_dag=True)는
DAGCircuit를 반환합니다TwoQubitBasisDecomposer인스턴스decomposer. -
LieTrotter.synthesize()이제QuantumCircuit.repeat()를 사용하여 첫 번째 트로터 스텝 이후 트로터 스텝의 추가 반복을 생성합니다. 이렇게 하면 호출 수가QuantumCircuit.compose()호출 수를reps만큼 줄이고 대규모 운영자의 런타임을 크게 줄입니다. -
새로운 합성 방법 추가
synth_permutation_reverse_lnn_kms()를 사용하여 선형 최접근 이웃 아키텍처에 대한 역순열의 새로운 합성 방법을 추가합니다. 이 알고리즘은 깊이가 있는 CX 게이트를 사용하여 선형 최인접 이웃 아키텍처를 통해 큐비트에 대한 역순열을 합성합니다( ). -
클래스가
TwoQubitBasisDecomposer클래스가 Rust로 재작성되어 런타임 성능이 크게 향상되었습니다. -
합성 클래스는
TwoQubitWeylDecomposition합성 클래스는 성능 향상을 위해 Rust에서 재작성되었습니다.
트랜스파일러 기능
-
CommutationChecker에서 수행하던 정류 분석을 추상 회로에서도 작동하도록 확장했습니다. 즉, 이제 분석 단계를 진행하기 전에 입력된 양자 회로의 각 연산이 행렬로 표현되는지 확인합니다. 이전에는 정류 분석이 물리적 회로에서만 수행되었습니다. 또한 각 연산은 이제 세션 커뮤테이션 라이브러리에서 캐시할 수 있는지 확인합니다. 예를 들어, 이제 다음을 계산할 수 있습니다AnnotatedOperation출퇴근. 이렇게 하면 다음과 같이 내부적으로CommutationChecker에 의존하는 트랜스파일러 패스를 사용할 수 있습니다CommutativeCancellation와 같은 기본 트랜스파일러 파이프라인의 초기 단계(기준 번역 이전)에서 실행할 수 있습니다. -
트랜스파일러 패스
ElidePermutations는 최적화 레벨 2와 3을 위해 초기화 단계에서 기본적으로 실행됩니다. 직관적으로, 제거SwapGate와PermutationGate를 제거하면 회로를 더 짧고 쉽게 라우팅할 수 있으므로 거의 항상 이점이 있습니다.OptimizeSwapBeforeMeasure는 특수한 경우이므로ElidePermutations의 특수한 경우이므로 최적화 레벨 3 패스 관리자의 초기화 단계의 일부로ElidePermuations패스로 대체되었습니다. -
새로운 최적화 트랜스파일러 패스를 추가했습니다,
ElidePermutations는 레이아웃 단계 이전에 실행되도록 설계되어 모든SwapGate와PermutationGate를 가상 큐비트를 순열하여 회로에서 최적화합니다. 예를 들어, 다음과 같은 회로를 예로 들어 보겠습니다SwapGates:
패스가 실행될 때 스왑을 제거합니다:
from qiskit.transpiler.passes import ElidePermutations from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.swap(0, 1) qc.swap(2, 0) qc.cx(1, 0) qc.measure_all() ElidePermutations()(qc).draw("mpl")
이 패스는 또한
virtual_permutation_layout속성 세트를 설정하여 최적화한 회로의 끝에 가상 큐비트의 순열을 저장합니다. -
이제
HLSConfig에는 이제 두 개의 추가 선택 인수가 있습니다.plugin_selection인수는"sequential"또는"all"로 설정할 수 있습니다. "순차적"(기본값)으로 설정하면 모든 상위 수준 객체에 대해HighLevelSynthesis패스는 지정된 메서드를 목록에 나타나는 순서대로 순차적으로 고려하고, 객체를 합성할 수 있는 첫 번째 메서드에서 중지합니다. "모두"로 설정하면 지정된 모든 방법이 고려되며plugin_evaluation_fn에 따라 가장 적합한 합성 회로가 선택됩니다.plugin_evaluation_fn인수는 합성된 양자 회로의 품질을 평가하는 선택적 콜러블로, 값이 작을수록 더 나은 회로를 의미합니다.None로 설정하면 회로의 품질은 크기(즉, 회로에 포함된 게이트 수)입니다.다음 예는 새로운 기능을 설명합니다:
from qiskit import QuantumCircuit from qiskit.circuit.library import LinearFunction from qiskit.synthesis.linear import random_invertible_binary_matrix from qiskit.transpiler.passes import HighLevelSynthesis, HLSConfig # Create a circuit with a linear function mat = random_invertible_binary_matrix(7, seed=37) qc = QuantumCircuit(7) qc.append(LinearFunction(mat), [0, 1, 2, 3, 4, 5, 6]) # Run different methods with different parameters, # choosing the best result in terms of depth. hls_config = HLSConfig( linear_function=[ ("pmh", {}), ("pmh", {"use_inverted": True}), ("pmh", {"use_transposed": True}), ("pmh", {"use_inverted": True, "use_transposed": True}), ("pmh", {"section_size": 1}), ("pmh", {"section_size": 3}), ("kms", {}), ("kms", {"use_inverted": True}), ], plugin_selection="all", plugin_evaluation_fn=lambda circuit: circuit.depth(), ) # synthesize qct = HighLevelSynthesis(hls_config=hls_config)(qc)이 예제에서는 다양한 파라미터를 사용하여 여러 합성 방법을 실행하여 깊이 측면에서 가장 적합한 회로를 선택합니다.
circuit.size()대신 최적화하면 다른 회로를 선택하게 됩니다. -
최적화 레벨 2와 3을 위해 사전 설정 패스 관리자의
CommutativeCancellation패스를 사전 설정 패스 관리자의init단계에 최적화 레벨 2 및 3에 추가했습니다. 이를 통해 프리셋 패스 관리자는 컴파일 파이프라인의 시작 부분에서 추가 논리 연산을 취소할 수 있습니다. -
이제 다음 분석 패스는 다음과 같이 인코딩된 제약 조건을 허용합니다
Targettarget로 인코딩된 제약 조건을 허용합니다:타깃 제약 조건은 나머지 트랜스파일러 파이프라인과의 일관성을 위해 사용자가 제공한 제약 조건보다 우선순위를 갖습니다.
-
새로운 메서드
Layout.inverse()메서드를 추가했습니다Layout객체의 역을 취하는 데 사용되는 새로운 메서드를 추가했습니다. 새로운 메서드 추가Layout.compose()두 개의 객체를 함께 구성하는 데 사용되는Layout객체를 함께 구성하는 데 사용되는 새로운 메서드를 추가했습니다. 새로운 메서드Layout.to_permutation()메서드가 추가되었습니다Layout객체에 해당하는 순열을 만드는 데 사용되는 새로운 메서드를 추가했습니다. -
트랜스파일러 패스에 새로운 감소가 추가되었습니다
OptimizeAnnotated트랜스파일러 패스에 새로운 감소 효과를 추가했습니다. 이 축소는 주석이 달린 연산(타입이AnnotatedOperation기본 연산 및 제어, 역 및 거듭제곱 수정자 목록 으로 구성된 객체)을 다음 속성을 가진 연산으로 검색합니다:- 기본 연산 을 합성해야 합니다(즉, 대상에서 이미 지원하지 않거나 동등성 라이브러리에 속하지 않음)
- 의 정의 회로는 - - 로 표현할 수 있습니다
이 경우 수정자는 -부분으로만 이동할 수 있습니다. 구체적인 예로, 제어된 QFT 기반 가산기의 형식은
control - [QFT -- U -- IQFT]이며,QFT -- control-[U] -- IQFT으로 단순화할 수 있습니다. 회로의QFT및IQFT부분에 대한 제어를 제거하면 트랜스파일된 회로에서 훨씬 더 적은 수의 게이트를 얻을 수 있습니다. -
클래스에 두 가지 새로운 메서드를 추가했습니다
DAGCircuit클래스에 두 개의 새로운 메서드를 추가했습니다:qiskit.dagcircuit.DAGCircuit.op_successors()노드의 후속 노드에 대한DAGOpNode노드의 후계자에게 반복자를 반환하고qiskit.dagcircuit.DAGCircuit.op_successors()이터레이터를 노드의DAGOpNode노드의 전임자에게 이터레이터를 반환합니다. -
새로운 트랜스파일러 패스를 추가했습니다,
RemoveFinalReset를 추가하여 큐비트 와이어의 최종 명령어인Reset연산을 제거합니다. 예를 들어, 최종Resets:
패스를 실행하면 최종 초기화가 제거됩니다:
from qiskit.transpiler.passes import RemoveFinalReset from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3, 1) qc.reset(0) qc.h(range(3)) qc.cx(1, 0) qc.measure(0, 0) qc.reset(range(3)) RemoveFinalReset()(qc).draw("mpl")
-
새로운 트랜스파일러 패스 추가
StarPreRouting스타 연결 하위 회로를 식별한 다음 최적의 선형 라우팅으로 대체하도록 설계되었습니다. 이는 번스타인-바지라니 및 QFT와 같이 이 회로 연결로 구성된 특정 회로에 유용합니다. 예를 들어,
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import StarPreRouting qc = QuantumCircuit(5) qc.h(0) qc.cx(0, range(1, 5)) StarPreRouting()(qc).draw("mpl")
또는 기존 사전 설정 패스 관리자를 확장할 수도 있습니다:
from qiskit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.transpiler.passes import StarPreRouting from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager cm = CouplingMap.from_line(5) qc = QuantumCircuit(5) qc.h(0) qc.cx(0, range(1, 5)) pm = generate_preset_pass_manager(2, coupling_map=cm) pm.init += StarPreRouting() result = pm.run(qc) result.draw("mpl")
시각화 기능
- 텍스트 및 Matplotlib 회로 서랍(
QuantumCircuit.draw())는 수동 실시간 변수가 포함된 표현식을 표시하는 데 최소한의 지원만 제공합니다. 연산과 변수 초기화는 아직 지원되지 않습니다Store연산과 변수 초기화는 아직 지원되지 않으며, 대규모 동적 회로의 경우 OpenQASM 3 내보내기 기능(qasm3.dumps())을 사용하여 회로의 텍스트 표현을 가져오는 것이 좋습니다.
기타 기능
- 이번 키스킷 릴리스는 NumPy 2.0 에 대한 지원을 마무리합니다. 키스킷은 당분간 NumPy 1.x 및 2.x 을 계속 지원할 예정입니다.
업그레이드 주의사항
-
에 대한 스타일 옵션의 하드 코딩을 제거합니다
plot_histogram(). 이렇게 하면 Matplotlib 스타일 파일을 그림에 충실하게 적용할 수 있습니다. Matplotlib 에서 설정한 기본값을 넘어서고 싶은 사용자는 직접 스타일 파일을 만들거나 MatplotlibAxes객체를plot_histogram에 전달하고 사용자 지정을 사후에 적용할 수 있습니다. -
함수는
transpile()함수는 내부적으로 백엔드 입력 유형을BackendV1를BackendV2로 변환하여 이제 트랜스필레이션 파이프라인에서Target. 이 변경에는 사용자 조치가 필요하지 않습니다.
회로 업그레이드 노트
-
의 난수 사용법이 변경되었습니다
QuantumVolume의 난수 사용이 변경되었으므로 이전 버전의 키스킷과 이 버전 간에 고정 시드를 위한 다른 회로를 얻게 됩니다. 무작위 단위 생성은 이제 더 많은 비트의 엔트로피를 사용하므로 대형 회로의 편향이 줄어듭니다. -
내부
UnitaryGate정의의 인스턴스에는QuantumVolume회로 정의의 내부 인스턴스에는 더 이상label필드 세트가 없습니다. 이전에는su4_<seed>문자열로 설정되었으며, 여기서<seed>은 해당 게이트에 대한 내부 Numpy pRNG 인스턴스의 시드를 나타내는 세 자리 숫자였습니다. 이렇게 하면 심각한 성능 문제가 발생하고 시드가 유용하지 않아야 합니다. 게이트에서 행렬을 검색해야 하는 경우 간단히Gate.to_matrix()메서드를 사용하면 됩니다.
기본형 업그레이드 노트
make_data_bin()함수는 더 이상 생성하고 반환하지 않습니다DataBin서브클래스를 생성하고 반환하지 않습니다. 대신 항상 항상DataBin클래스를 반환합니다. 그러나 이전 버전과의 호환성을 위해 계속 존재하지만 결국 더 이상 사용되지 않을 것입니다. 모든 사용자는 인스턴스를 직접 생성하도록 마이그레이션해야 합니다DataBinmake_data_bin()의 출력으로 서브클래스를 인스턴스화하는 대신 직접 인스턴스화해야 합니다.
공급자 업그레이드 안내
-
의 구현
BackendV2(및BackendV1)의 구현은run()메서드를 업데이트하여 타입이 지정된 클래식 변수가 포함된 입력을 열심히 거부할 수 있습니다(qiskit.circuit.classical) 및Store인스트럭션을 지원하지 않는 경우). 새로운Store명령어는 트랜스파일러에서 항상 사용 가능한 "지시어"(Barrier); 백엔드가 지원하지 않는 경우, 이 명령어는transpiler.자세한 내용은 실시간 변수를 참조하세요.
QPY 업그레이드 노트
- 의 값은
qiskit.qpy.QPY_VERSION의 값은 이제 12입니다.QPY_COMPATIBILITY_VERSION는 10으로 변경되지 않습니다.
합성 업그레이드 노트
- 더 이상
TwoQubitWeylDecomposition는 더 이상 생성 시 서브클래스로 자체 특화되지 않습니다. 이것은 이전에TwoQubitWeylDecomposition의 내부 세부 사항이었으며, 모든 서브클래스가 동일하게 동작하고 내부 디스패치에만 사용되었기 때문에 문서화된 공개 동작은 아니었습니다. 그러나 이 릴리스 노트는 발견 가능한 동작이었기 때문에 더 이상 이러한 동작이 발생하지 않으며 모든 인스턴스의TwoQubitWeylDecomposition의 모든 인스턴스는 동일한 유형이 될 것입니다. 클래스의 공용 메서드에 대한 동작은 변경되지 않습니다.
트랜스파일러 업그레이드 노트
- 프리셋
StagedPassManager은 최적화 레벨 2에 대해generate_preset_pass_manager()및level_2_pass_manager()가 런타임과 최적화 사이의 균형을 개선하기 위해 재작업되었습니다. 즉, 이전 릴리스와 비교하여 출력 회로가 변경됩니다. 이전 릴리스의 레벨 2에서 정확한 패스 관리자가 필요한 경우 수동으로 빌드하거나 이전 릴리스에서 사용하고 회로를 저장한 후qpy를 사용하여 회로를 저장하여 최신 릴리스에서 로드할 수 있습니다.
기타 업그레이드 주의사항
- 이제 지원되는 Windows의 최소 버전은 Windows 10입니다. 이전 릴리스에서는 지원되는 최소 Windows 버전을 명시적으로 나열하지 않았으며 암시적으로 Windows 7, 8 및 8.1 이 작동했을 수 있습니다(테스트되지 않음). 그러나 Rust 1.78 가 이전 버전의 Windows에 대한 지원을 중단함에 따라 PyPI 에 게시된 키스킷의 바이너리는 이번 릴리스부터 이전 버전의 Windows를 지원하지 않습니다. 이전 버전의 Windows를 사용하는 경우 이전 버전의 Rust 컴파일러를 사용하여 소스에서 키스킷을 빌드할 수 있지만(현재 소스에서 빌드할 때 지원되는 키스킷의 최소 Rust 버전은 1.70 ), 이전 버전의 Windows는 지원되는 플랫폼이 아니며 테스트되지 않았습니다.
지원 중단 노트
-
Python 3.8 으로 키스킷 실행에 대한 지원은 더 이상 사용되지 않으며, 키스킷 1.3.0 릴리스에서 제거될 예정입니다. 1.3.0 은 Python 3.8 이 수명이 종료되어 더 이상 지원되지 않는 후 첫 번째 릴리스입니다. [1] 즉, 1.3.0 릴리스부터는 사용 중인 Python 버전을 Python 3.9 이상으로 업그레이드해야 합니다.
제공자 기능 폐기
-
추상 베이스 클래스
Provider와ProviderV1는 이제 더 이상 사용되지 않으며 키스킷 2.0.0 에서 제거될 예정입니다. 이러한 인터페이스 정의가 제공하는 추상화는 실질적인 가치를 제공하지 않았으며name,backends,get_backend()속성을 캡슐화했을 뿐입니다. 개념상 _공급자_는 백엔드 모음으로 계속 존재할 것입니다. 현재 공급자를 구현 중인 경우 구현의 부모 클래스로ProviderV1을 제거하여 코드를 조정할 수 있습니다. 이 일환으로 이전 버전과의 호환성을 위해get_backend구현을 추가하고 싶을 것입니다. 예를 들어,def get_backend(self, name=None, **kwargs): backends = 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]
합성 기능의 사용 중단
- 메서드
TwoQubitWeylDecomposition.specialize()메서드는 이제 더 이상 사용되지 않으며 키스킷 2.0.0 릴리스에서 제거될 예정입니다. 이 메서드는 공개 목적이 없었으며 최종 사용자가 객체에서 계산된 분해를 변경하고 객체에 잘못된 필드를 생성하므로 호출하기에 안전하지 않았습니다. 내부적으로만 새 객체를 구성하는 데 사용되었습니다TwoQubitWeylDecomposition객체를 생성할 때만 사용됩니다. 그럼에도 불구하고 이 클래스는 여전히 공용 API의 문서화된 부분이었으며, 현재는 대체할 수 있는 방안 없이 사용되지 않습니다. 이번 릴리스에서는 클래스의 Rust 재작성의 일부로 전문화 서브클래싱이 제거되었으므로 호출 시 항상NotImplementedError을 반환합니다.
트랜스파일러 사용 중단 사항
-
qiskit.transpiler.passes.CXCancellation패스는 더 이상 사용되지 않습니다InverseCancellation로 대체되었습니다.CXCancellation는InverseCancellation([CXGate()])와 의미적으로 완전히 동일합니다. -
트랜스파일레이션 패스
qiskit.transpiler.passes.ALAPSchedule는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 패스는 분석 패스인ALAPScheduleAnalysis로 대체되며, 이는 분석 패스입니다. -
트랜스파일레이션 패스
qiskit.transpiler.passes.ASAPSchedule는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 으로 대체되었습니다ASAPScheduleAnalysis와 새로운 스케줄링 워크플로로 대체되었습니다. -
트랜스파일레이션 패스
qiskit.transpiler.passes.DynamicalDecoupling는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 대신 동일한 기능을 수행하는PadDynamicalDecoupling를 사용하면 동일한 기능을 수행하지만 그 전에 스케줄링 및 정렬 분석 패스를 실행해야 합니다. -
트랜스파일레이션 패스
qiskit.transpiler.passes.AlignMeasures는 이제 더 이상 사용되지 않습니다. 2022년 6월에 출시된 키스킷 0.37 (테라 0.21 ) 이후 사용 중단 대기 중이었습니다. 대신 동일한 기능을 수행하는ConstrainedReschedule를 사용하면 동일한 기능을 수행하며 추가 타이밍 제약 조건에 맞게 정렬할 수 있습니다.
시각화 기능의 사용 중단
- 타임라인 서랍의
show_idle및show_barrier매개변수는 회로 서랍 매개변수와 일치하도록 각각idle_wires및plot_barriers으로 대체되었습니다. 이전 이름은 이제 더 이상 사용되지 않으며 다음 주요 릴리스에서 제거될 예정입니다. 새로운 매개변수는 완전히 동일합니다.
버그 수정
-
함수 관련 문제를 수정했습니다
qpy.dump()함수에서use_symengine플래그가True로 평가되지만 실제로는 부울True이 아닌 진실 객체로 설정된 경우, 생성된 QPY 페이로드가 손상되는 문제를 수정했습니다. 예를 들어use_symengine를HAS_SYMENGINE로 설정하면 이 객체는 부울로 캐스팅할 때True로 평가되지만 실제로는True이 아닙니다. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및QuantumCircuit.draw()메서드 관련 문제를 수정했습니다. -
트랜스파일러 패스에
ConstrainedReschedule트랜스파일러 패스가 이전에 회로에 명령어가 포함된 경우 오류가 발생하던 문제를 수정했습니다Reset인스트럭션이 포함된 경우 오류가 발생하던 문제를 수정했습니다. 패스가 더 이상 오류가 발생하지 않도록 수정되었지만, 실제 하드웨어는 특히 중간 회로 측정 및 재설정 시 키스킷 스케줄러가 가정하는 것과 다르게 동작할 수 있습니다. 키스킷 스케줄러는 둘 중 하나를 포함하는 회로를 만나면RuntimeWarning을 발생시킵니다. 수정 #10354 -
CommutationChecker클래스에서 게이트의name속성이 UTF8 인코딩된 경우 오류가 발생하는 문제를 수정했습니다. 이전에는 ascii 인코딩이 있는 게이트 이름만 작동했습니다. 수정 #12501 -
의 문제를 수정했습니다
SparsePauliOp.apply_layout()및Pauli.apply_layout()메서드에 중복되거나 음수 인덱스가 있는 잘못된 배열이layout인수로 전달되었을 때 발생하는 문제를 수정했습니다. 이전에는 오류가 발생하지 않았고 수행된 변환이 유효하지 않았습니다. 이제 이러한 메서드는 레이아웃의 일부로 중복 인덱스나 음수 인덱스가 제공되면QiskitError를 반환합니다. 레이아웃의 일부로 중복 인덱스 또는 음수 인덱스가 제공된 경우. -
의 성능 문제를 수정했습니다
BackendSamplerV2및BackendEstimatorV2. 수정 #12290 -
의 문제를 수정했습니다
convert_to_target()객체에서 제어 흐름 명령이 지정되는 일반적인 위치인BackendConfiguration.supported_instructions어트리뷰트에 지정된 경우 변환기가 제어 흐름 명령을 잘못 무시하는 문제를 수정했습니다BackendConfiguration객체에서 지정되는 일반적인 위치입니다. 11872 수정. -
관련 문제를 수정했습니다
circuit_drawer()또는QuantumCircuit.draw()mpl출력 옵션을 사용할 때 그려지는 회로에 ControlFlow 연산이 있고fold옵션이 -1 (접힘 없음)으로 설정되어 있는 경우 프로그램이 중단되는 문제를 수정했습니다. 12012번 수정. -
사용자 지정 펄스 지침을 레거시 형식으로 변환하는 버그가 수정되었습니다
qiskit.qobj형식으로 변환하는 버그를 수정했습니다. 이 버그는 키스킷( 1.0.0 )에 도입되어 사용자 지정 펄스 모양을 가진 명령어를 변환할 때 오류가 발생했습니다. 수정 후 변환이 올바르게 수행되고 사용자 지정 펄스가 원래대로Waveform로 변환됩니다. 11828 수정. -
의 버그가 수정되었습니다
transpile()의 버그가 수정되었습니다. 사용자 정의instruction_durations,dt및backend_properties제약 조건이 백엔드 유형BackendV2. 수정 후 동작은 이제 제공된 백엔드가 유형이BackendV1유형인지 또는BackendV2. 마찬가지로, 사용자 정의timing_constraints는 이제target입력에 의해 재정의되지만BackendV1및BackendV2입력보다 우선합니다. -
호출
EquivalenceLibrary.set_entry()을 호출하면 이제 라이브러리의 내부 그래프 객체가 올바르게 업데이트됩니다. 이전에는 메타데이터는 업데이트되지만 그래프 구조는 변경되지 않았기 때문에 다음과 같은 사용자는BasisTranslator와 같은 사용자는 여전히 이전 규칙을 사용하게 됩니다. 11958 수정. -
이제
EvolvedOperatorAnsatz는 이제 연산자 인수가 빈 목록인 경우를 올바르게 처리합니다. 이전에는 이렇게 하면 오류가 발생했습니다. -
이제부터
EvolvedOperatorAnsatz는 큐비트가 0인 경우 큐비트가 하나도 없는 대신QuantumRegister인스턴스를 갖게 됩니다. 이 동작은 슈퍼클래스와 더 일관되게 일치합니다QuantumCircuit. -
메서드
Instruction.repeat()는 이제 세트condition를 바깥쪽 반환된Instruction로 이동하고 정의의 내부 게이트는 무조건 남겨둡니다. 이전에는 메서드가 내부 정의 내에ClassicalRegister인스턴스를 내부 정의 내에 남겨두었는데, 이는 유효하지 않은 상태였으며 나중에 트랜슬레이션이나 내보내기 중과 같이 겉보기에는 관련이 없는 버그로 나타났습니다. 고정 #11935. -
트랜스파일러 패스의 문제를 수정했습니다
InverseCancellation트랜스파일러 패스에서 경우에 따라 파라미터 값이 일치하지 않더라도 자체 역 파라미터화된 게이트가 잘못 취소되는 문제를 수정했습니다. 수정 #11815 -
게이트의 분해 개선
MCXGate와MCPhaseGate의 분해를 개선하여 안실라 큐비트를 사용하지 않고도CXGate가 기하급수적으로 증가하지 않고 큐비트 수가 기하급수적으로 증가하도록 개선합니다. -
함수 충돌 버그가 수정되었습니다
convert_to_target()함수를 충돌시키는 버그가 수정되었습니다( T1, T2 또는 주파수 중 하나). 에서 누락된 속성 값은QubitProperties로 채워집니다None. -
BasePassManager.run()은 더 이상 이전 워크플로우를PropertySet을 두 번 이상 호출할 때 새 워크플로로 누출되지 않습니다. 이전에는 이전과 동일한PropertySet을 사용하여 후속 실행을 초기화했는데, 이는 잘못된 속성 정보가 작업에 제공되고 있음을 의미할 수 있습니다. 이제 동작은 Qiskit 0.44 의 동작과 일치합니다. 수정 #11784. -
Pauli.evolve()이제 ECR 게이트가 포함된 양자 회로를 올바르게 처리합니다. 이전에는 클리포드 게이트로 인식되지 않아 오류가 발생했습니다. -
버그를 수정했습니다
Pauli.evolve()특정 클리포드 게이트('cx', 'cz' 등)와 이름이 일치하는 회로로 진화하면 회로의 내용이 아닌 회로 이름에 따라 폴리가 진화하는 버그가 수정되었습니다. 이 버그는 기본 옵션이 아닌frame='s'에서만 발생했습니다. -
회로에서 많은 수의 큐비트와 비트를 역직렬화할 때
qpy.load()함수의 성능 문제를 수정했습니다. 회로에 많은 수의 큐비트 또는 클릿이 있는 QPY 페이로드를 역직렬화할 때. -
default_alignment인수의 처리 버그를 수정했습니다build(). 유형의 입력AlignmentKind유형의 입력은 이제 기본 정렬로 올바르게 처리됩니다. -
qiskit.pulse.utils.format_parameter_value()함수에서 큰 정수를 실수로 부동 소수점 값으로 변환하거나 예기치 않은 반올림을 일으키는 버그가 수정되었습니다. 자세한 내용은 #11971을 참조하세요. -
클래스의 문제를 수정합니다
QDrift클래스에서 해밀턴 계수가 각 계수의 절대값을 취하여 강제로 양수가 되게 했던 문제를 수정했습니다. 음수 계수의 부호가 다시 추가되도록 수정되었습니다. -
convert_durations_to_dt()에서 속성의 원래 단위와 관계없이 회로 지속 시간에 대해 초에서dt로의 변환을 맹목적으로 적용하는 버그가 수정되었습니다. 이로 인해 보고된 회로 지속 시간이 잘못 계산될 수 있습니다. -
수정
SparsePauliOp.apply_layout()가 제로 큐비트 연산자와 올바르게 작동하도록 수정되었습니다. 예를 들어 이전에 0 큐비트를 생성하고 다음과 같은 레이아웃을 적용한 경우입니다:op = SparsePauliOp("") op.apply_layout(None, 3)이전에는 오류가 발생했을 것입니다. 이제 형식의 연산자가 올바르게 반환됩니다:
SparsePauliOp(['III'], coeffs=[1.+0.j]) -
트랜스파일러 패스의
Commuting2qGateRouter트랜스파일러 패스에서 qreg 순열이 패스 속성 세트에 추가되지 않아 사용자가 수동으로 추적해야 하는 문제를 수정했습니다. 이제 출력 회로의layout속성을 통해 순열에 액세스하고 정보 손실 없이 모든 트랜스필레이션 파이프라인에 패스를 연결할 수 있습니다. -
특정 펄스 단위를 초와 나노초 사이로 스케일링할 때 부동 소수점 부정확성을 수정했습니다. 펄스가 기호적으로 정의된 경우,
symengine의 특정 빌드에 대한 스케일링으로 인해 불필요한 부동 소수점 오류가 발생할 수 있으며, 심볼이 완전히 바인딩되면 예기치 않은 결과가 나타날 수 있습니다. 수정 #12392. -
의 사전 설정 패스 관리자
transpile()의 사전 설정 패스 관리자는 하드웨어 타겟 또는 기본 게이트 세트가 지정되지 않은 경우 제어 흐름이 있는 회로에서 더 이상 실패하지 않습니다. 이제 이러한 추상적인 대상을 모든 제어 흐름 작업을 허용하는 것으로 취급합니다. 11906 수정. -
qiskit.instruction.Instruction.soft_compare()메서드는 두 게이트의 이름, 큐비트 수, 클릿 수, 매개변수 수가 일치하는지 비교하기 위한 것입니다. 그러나 일치하는 큐비트 수와 클릿 수를 확인하지 않는 오타가 있었습니다. 이렇게 하면 명백한 오타가 해결됩니다. -
기본
init플러그인은 잘못된 최적화 수준으로 호출될 때TranspilerError를 제대로 발생시키지 않았습니다. -
생성자 메서드 관련 문제를 수정했습니다
Operator.from_circuit()생성자 메서드에서 최종 레이아웃 순열을 잘못 해석하여 유효하지 않은 배열이Operator가 생성되던 문제를 고쳤습니다. 이전에는 초기 레이아웃에 관계없이 최종 레이아웃이 처리되었기 때문에, 초기 레이아웃이 중요하지 않은 모든 양자 회로에 대해 초기화가 잘못되었습니다. -
여러 회로를 병렬로 실행할 때
PassManager.run()에서 여러 회로를 병렬로 실행할 때 발생하는 성능 문제를 수정했습니다. 더 이상 여러 입력을 직렬로만 처리할 경우 병렬 실행의 요구 사항인PassManager(병렬 실행을 위한 요구 사항)를 직렬화하는 데 더 이상 시간을 소비하지 않습니다(여러 입력이 주어졌을 때 입력을 직렬로만 처리할 경우). -
Parameter는 동일하게 비교되는 인스턴스가 항상 동일한 해시를 갖도록 업데이트되었습니다. 이전에는Parameter.uuid만 비교되었기 때문에Parameteruuid매개변수의 공통 값(일반적으로 명시적으로 전달되지 않음)을 사용하여 구성한 경우 이름이 다른 인스턴스도 동일하게 비교될 수 있었습니다. -
plot_coupling_map()에서 커플링 맵의 가장자리 색상이 잘못 지정되던 버그를 수정했습니다. 수정 #12369. -
OpenQASM 2.0 파서(
qasm2.load()및qasm2.loads())는 이제 시스템 크기 정수를 오버플로하는 정수 피연산자를 포함한 게이트-각 식을 평가할 수 있습니다. 나머지 표현식은 항상 그랬던 것처럼 배정밀도 부동소수점 컨텍스트에서 평가됩니다. 그러나 임의로 큰 정수는 반드시 배정밀도 부동 소수점으로 정확히 표현할 수 있는 것은 아니므로 회로가 어떻게 생성되었든 이미 모든 수치 정밀도 모듈로 를 잃었을 가능성이 있습니다. -
ParameterOpenQASM 3 프로그램에서input변수의 스탠드인으로 사용되는 인스턴스는 이제 OpenQASM 3으로 내보내는 동안 내장 게이트와의 충돌을 피하기 위해 이름이 이스케이프됩니다. 이전에는 명명 충돌이 발생하여 내보내기가 잘못된 OpenQASM 3을 생성할 수 있었습니다. -
버그 수정
QuantumCircuit.draw()의 버그가 수정되어 Matplotlib 서랍의 사용자 정의 스타일 사전이 실행 시 수정되었습니다. -
QuantumCircuit.append()를copy=True(기본값)과 함께 사용하면 이제 매개변수화된 명령어가 올바르게 복사됩니다ParameterExpression인스턴스뿐만 아니라Parameter인스턴스가 아닌 -
사용자 지정 회로 보정의 내부 처리 및
InstructionDurations함수에서 개별 트랜스파일러 패스로 오프로드되었습니다transpile()함수에서 개별 트랜스파일러 패스로 오프로드되었습니다:DynamicalDecoupling,DynamicalDecoupling. 이전에는 명령_durations 입력 인수에 수동으로 통합하지 않으면 회로 보정의 명령 지속 시간이 고려되지 않았지만, 이제 필요한 패스는 회로를 분석하여 타깃 > 사용자 정의 입력 > 회로 보정의 우선 순위에 따라 가장 관련성이 높은 지속 시간 값을 선택하게 됩니다. -
버그 수정
transpile()에서dt또는instruction_durations인수가 제공된 경우에만num_processes인수가 사용되던 버그를 수정했습니다.
기타 참고사항
-
arm64 macOS 플랫폼에 대한 지원이 티어 3에서 티어 1로 승격되었습니다. 이전에는 플랫폼에서 키스킷을 테스트할 수 있는 CI 환경이 없었기 때문에 플랫폼이 티어 3에 있었습니다. 이제 Github에서 오픈 소스 프로젝트 [1] 에 arm64 macOS 환경을 제공하므로 다른 티어 1 지원 플랫폼과 함께 이 플랫폼을 테스트하고 있습니다.
[ 1 ]
1.0.0rc1
공급자 업그레이드 안내
-
더 이상 사용되지 않는
qiskit.providers.fake_provider모듈이qiskit-ibm-runtimePython 패키지로 마이그레이션되었습니다. 이러한 이유로, 키스킷의 다음 요소들은qiskit.providers.fake_provider의 다음 요소는 키스킷에서 더 이상 사용되지 않음에 따라 제거되었습니다 0.46:qiskit.providers.fake_provider.FakeProviderqiskit.providers.fake_provider.FakeProviderForBackendV2qiskit.providers.fake_provider.FakeProviderFactoryqiskit.providers.fake_provider.fake_backends.FakeBackendV2qiskit.providers.fake_provider.backends에 포함된 모든 가짜 백엔드(공급자를 통해 액세스 가능)qiskit.providers.fake_provider.FakeQasmSimulatorqiskit.providers.fake_provider.FakeJobqiskit.providers.fake_provider.FakeQobj
새 가짜 공급자 모듈을 사용하려면
pip install qiskit-ibm-runtime을 실행하고 qiskit 가져오기 경로(qiskit.providers.fake_provider)를 새 가져오기 경로(qiskit_ibm_runtime.fake_provider)로 바꾸면 됩니다. 마이그레이션 예시:# Legacy path from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke() # New path # run "pip install qiskit-ibm-runtime" from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke()또한, 특수 테스트 목적으로 설계된 다음과 같은 가짜 백엔드가 새로운
GenericBackendV2클래스로 대체되었으며, 키스킷에서 더 이상 사용되지 않음에 따라 제거되었다 0.46:qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2`qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitPropsqiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple
새 클래스로의 마이그레이션 예제
GenericBackendV2클래스로의 마이그레이션 예제:# Legacy path from qiskit.providers.fake_provider import FakeBackend5QV2 backend = FakeBackend5QV2() # New path from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=5) # note that this class will generate 5q backend with generic # properties that serves the same purpose as FakeBackend5QV2 # but will generate different results