키스킷 0.39 릴리즈 노트
0.39.5
테라 0.22.4
Prelude
키스킷 테라 0.22.4 는 0.22 시리즈에서 확인된 일부 버그를 수정하는 마이너 버그 수정 릴리스입니다.
버그 수정
-
의 버그를 수정했습니다
BackendSampler의 버그를 수정했습니다run()메서드를 두 번 연속으로 호출하면 오류가 발생하던 버그를 수정했습니다. -
에서 두 가지 버그를 수정했습니다
ComposedOp에서 두 가지 버그를 수정했습니다ComposedOp.to_matrix()메서드가 컴포지션에 대해 올바른 결과를 제공하지 않는 두 가지 버그가 수정되었습니다StateFn와 전역 계수가 있는 컴포지션에 대해 올바른 결과를 제공하지 않는 두 가지 버그를 수정했습니다. 수정 #9283. -
프리미티브
Sampler과Estimator가numpy.ndarray를 매개변수로 전달할 때 작동하지 않던 문제를 수정했습니다. -
의 버그를 수정했습니다
SamplingVQE에서aggregation인수가 영향을 미치지 않는 버그를 수정했습니다. 이제 집계 함수와 이를 통해 CVaR 기대값을 올바르게 지정할 수 있습니다. -
성능 버그가 수정되었습니다
SamplingVQE가 고유 상태의 에너지를 느리게 평가하는 성능 버그를 수정했습니다. -
에서 베타 매개변수의 자동 평가가 수정되었습니다
VQD의 베타 파라미터 자동 평가를 수정하고SparsePauliOp입력에 대한 지원을 추가하고, 두 작업이 모두 제출된 후에만 작업 결과를 검색하여 프리미티브의 비동기 실행을 활용하도록 에너지 평가 기능을 수정했습니다. -
의 문제를 수정했습니다
Statevector.probabilities_dict()및DensityMatrix.probabilities_dict()메서드가qargs인수를 지정했을 때 비쿼비트 시스템에 대해 잘못된 결과를 반환하는 문제를 수정했습니다. 수정 #9210 -
일부
classmethod의 처리 문제를 수정했습니다wrap_method()에서 Python 3.11. 이전에는 Python 3.11 에서wrap_method이classmethod에 연결된 바인딩되지 않은 함수를 래핑한 다음 호출하면 일반적으로classmethod에 바인딩된 클래스 객체가 함수에 전달되지 않았기 때문에 실패했습니다. Python 3.11.1 에서부터 이 문제는QiskitTestCase에 영향을 미쳐 다른 테스트 코드에서 가져올 수 없게 되었습니다. 수정 #9291.
에어 0.11.2
변경 없음
IBM Q 제공자 0.19.2
변경 없음
0.39.4
테라 0.22.3
변경 없음
에어 0.11.2
새 기능
- Python 3.11 지원으로 키스킷 에어 실행에 대한 지원이 추가되었습니다.
알려진 문제점
- AerStatevector 에서 두 가지 버그를 수정했습니다. AerStatevector 메서드에서는 사용할 수 없는 mc* 인스트럭션을 사용하며, 이는 matrix_product_state 메서드에서는 사용할 수 없습니다. 이 커밋은 AerStatevector 을 MC*를 사용하지 않고 H, X, Y, Z, U 및 CX를 사용하도록 변경합니다. AerStatevector 명령이 빈 QuantumCircuit 으로 분해되는 경우에도 실패합니다. 이 커밋은 그러한 지시를 허용합니다.
버그 수정
-
AerSimulator.from_backend()메서드에서AerSimulator인스턴스를 aBackendV2객체에서 인스턴스화할 수 있도록 수정했습니다. 이전에는AerSimulator.from_backend()를 객체와 함께 사용하려고 하면BackendV2객체를 사용하려고 하면 지원되지 않는다는AerError오류가 발생했을 것입니다. -
BackendV2객체가 포함된NoiseModel.from_backend()가 비게이트 인스트럭션에서 과도한QuantumError초를 가진 노이즈 모델을 생성할 수 있는 버그 수정(예:ReadoutError초만 측정에 충분해야 하는 경우). 이 커밋은BackendV2객체로NoiseModel.from_backend()을 업데이트하여 해당BackendV1객체로 호출한 것과 동일한 노이즈 모델을 반환합니다. 즉, 결과 노이즈 모델에는 측정값에 대한QuantumErrors가 포함되지 않으며 재설정과 같은 다른 비게이트 명령에 대한 열 완화 오류만 포함될 수 있습니다. 여전히 측정값에ReadoutError가 포함되어 있습니다. -
NoiseModel.from_backend()에서 기본값이 아닌 값으로temperaturekwarg를 사용하면 지정된 온도에 대한 여기 상태 모집단을 잘못 계산하는 버그가 수정되었습니다. 이전에는 볼츠만 분포 계산에 2라는 추가 계수가 있었기 때문에 여기 상태 모집단의 값이 부정확하게 작아졌습니다. -
제어 흐름 컴파일러에서 실행 중에 관련 없는 명령어가 제어 흐름 본문 '내부'에 표시되어 잘못된 결과를 초래할 수 있는 잘못된 로직을 수정했습니다. 예를 들어, 이전에는
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") circuit = QuantumCircuit(3, 3) circuit.measure(0, 0) circuit.measure(1, 1) with circuit.if_test((0, True)): with circuit.if_test((1, False)): circuit.x(2) with circuit.if_test((0, False)): with circuit.if_test((1, True)): circuit.x(2) circuit.measure(range(3), range(3)) print(backend.run(circuit, method=method, shots=100).result())는 중첩된 제어 흐름 연산이 실행되어야 할 큐비트 2의 첫 번째 X 게이트를 실수로 건너뛰기 때문에
{'010': 100}를 출력합니다. -
T2 > 2 * T1 같은 비물리적 장치 매개변수를 보고하는 백엔드를 제공할 때 통계적 추정 오류로 인해
NoiseModel.from_backend()에 자세한 경고를 출력하는 버그를 수정했습니다. 이 커밋은noise.device모듈 내에서 수행되는 것처럼 이론적 범위로 잘라내는 것 외에 다른 방법이 없다는 점에서 사용자가 실행할 수 없으므로 이러한 경고를 제거합니다. 수정된 버그에 대한 자세한 내용은 1631호를 참조하세요. -
GPU 상태 벡터 시뮬레이터에 대한 수정 사항입니다. 청크 배포가 GPU의 모든 여유 메모리를 할당하려고 시도했지만 이로 인해 메모리 할당 오류가 발생했습니다. 따라서 이 수정 사항은 사용 가능한 메모리의 80%를 할당합니다. 또한 노이즈 샘플링이 적용될 때 매트릭스 버퍼의 크기를 수정합니다.
-
캐시 차단으로 실행되는 AerState 의 수정 사항입니다. AerState 캐시 차단을 위해 Aer의 트랜스파일러를 잘못 구성한 후 큐비트를 교환하는 알고리즘이 잘못 작동했습니다. 이 수정으로 AerState 이 트랜스파일러를 사용하도록 수정합니다. 보다 구체적으로, 트랜스퓔레이션 후 스왑된 큐비트 맵은 AerState 을 사용할 때 원래 맵으로 복구됩니다. 이 수정은 AerStatevector 에서 다중 GPU를 사용하려면 필요합니다.
-
AerStatevector 에 대한 수정 사항입니다. 테라의 스테이트벡터에서 직접 AerStatevector 인스턴스를 생성할 수 없었습니다. 이 수정으로 상태 벡터를 AerStatevector’s 입력으로 사용할 수 있습니다.
-
SamplerResult.quasi_dists에는 큐비트 수에 대한 데이터가 포함됩니다.QuasiDistribution.binary_probabilities()는 올바른 길이의 비트 문자열을 반환합니다. -
이전에는 AerStatevector 에서 시드가 초기화되지 않았으며 샘플링된 결과는 항상 동일합니다. 이 커밋을 사용하면 각 샘플링에 대해 시드가 초기화되고 샘플링 결과가 달라질 수 있습니다.
IBM Q 제공자 0.19.2
변경 없음
0.39.3
테라 0.22.3
Prelude
키스킷 테라 0.22.3 는 0.22 시리즈의 몇 가지 추가 버그를 수정하는 마이너 버그 수정 릴리스입니다.
버그 수정
-
AdaptVQE이제 보조 연산자를 지원함을 올바르게 표시합니다. -
회로 서랍(
QuantumCircuit.draw()및circuit_drawer())는 회로의 내용에 모든 비트를 개별적으로 그려야 하는 경우 기본 인수를 사용할 때cregbundle매개변수에 대한 경고를 더 이상 표시하지 않습니다. 이는 새로운 스타일의 제어 흐름 연산으로 회로를 그리려고 할 때 가장 많이 나타납니다. -
1보다 큰 값을 설정했을 때
QNSPSAmax_evals_grouped가 1보다 큰 값으로 설정된 경우 실패하는 버그를 수정했습니다. -
패스와 관련된 문제를 수정했습니다
SabreSwapseed인수를 지정하지 않고 패스를 여러 번 실행하면 다른 시드를 사용하는 대신 실행 사이에 동일한 난수 생성기 시드를 재사용하도록 하는 패스의 문제를 수정했습니다. 이로 인해 이전에는seed을 지정하지 않아도 실행 간에 동일한 결과가 반환되었습니다. -
프리미티브 클래스 관련 문제를 수정했습니다,
BackendSampler와BackendEstimator로 인스턴스를 직렬화할 수 없던 문제를 수정했습니다(pickle). 일반적으로 이러한 클래스는 다음과 같이 직렬화할 수 없습니다BackendV2와BackendV1인스턴스는 직렬화 가능해야 할 필요는 없지만 (그리고 종종 그렇지 않은 경우도 있습니다), 클래스 정의의BackendSampler와BackendEstimator의 클래스 정의는 더 이상pickle의 사용을 막지 않습니다. -
이제 이전과 마찬가지로
pulse.Instruction.draw()메서드가 성공합니다. 이 방법은 대체 계획 없이 더 이상 사용되지 않지만 사용 중단 기간 동안은 계속 작동합니다.
에어 0.11.1
변경 없음
IBM Q 제공자 0.19.2
변경 없음
0.39.2
테라 0.22.2
Prelude
키스킷 테라 0.22.2 는 사소한 버그 수정 릴리스이며, Python 3.11 에 대한 첫 번째 공식 지원입니다.
버그 수정
-
백엔드 프리미티브 클래스 관련 문제 수정
BackendSampler와BackendEstimator필드가 설정되지 않은BackendV1max_experiments필드가 설정되지 않은 인스턴스의BackendConfiguration. -
백엔드에서 정의된
VF2PostLayout정의된 백엔드에 대해 트랜스파일링할 때 정의된Target가 정의된 백엔드에 대한 트랜스파일링 시 인터랙션 그래프가 잘못 작성되는 버그를 수정했습니다. 그래프가 필요 이상으로 복잡해져 런타임이 과도하게 늘어날 수 있습니다. -
펄스 표현식 구문 분석기가 더 이상 Jupyter 노트북에서 호출될 때 주기적으로 중단되지 않습니다. 이는 메모화가 평가하기 특히 어려워 보이는 재귀 객체의 내부
deepycopy를 피함으로써 달성할 수 있습니다.
에어 0.11.1
변경 없음
IBM Q 제공자 0.19.2
변경 없음
0.39.1
테라 0.22.1
Prelude
키스킷 테라 0.22.1 는 버그 수정 릴리스로, 0.22.0 릴리스 이후 확인된 몇 가지 사소한 문제를 해결합니다.
지원 중단 노트
- 의
pauli_listkwargpauli_basis()는 더 이상 사용되지 않습니다pauli_basis()는 이제 항상PauliList. 이 인수는 키스킷 테라 0.22.0 에서 조기에 제거되어pauli_list``argument. Now, the argument has been restored but will emit a ``DeprecationWarning을 사용하던 사용자들의 호환성을 깨뜨렸습니다. 사용하면 키스킷 테라 0.22.0 aPauliList는 항상 반환됩니다.
버그 수정
-
트랜스파일러 패스가
BarrierBeforeFinalMeasurements트랜스파일러 패스를 수정했습니다Clbit의 최종 측정 레이어 바로 직전에 조건이 있을 때 트랜스파일러 패스를 수정했습니다. 이전에는 내부 임시 회로에 비트가 존재하지 않는다고 주장하며 실패했습니다. 수정 #8923 -
에 대한 동일성 검사기
QuantumCircuit과DAGCircuit(동일한 유형의 객체 포함)에 대한 동일성 검사기는 이제 단일 비트에 대한 조건을 올바르게 처리합니다. 이전에는 비트가 회로 명령어의 나머지 속성이 받는 '의미론적' 검사 대신 '정확한' 동일성 검사를 사용했기 때문에 동일성에 대한 잘못된 네거티브가 발생했습니다. -
제어 흐름에서 클래식 비트 처리 수정
StochasticSwap의 클래식 비트 처리를 수정했습니다. 이전에는 제어 흐름 연산이 외부 회로의 모든 클래식 비트를 포함하도록 확장되었다가 다시 축소되지 않아 명령어가 필요하다고 보고한 클릿 수와 실제 공급된 클릿 수가 불일치하는 문제가 발생했습니다. 수정 #8903 -
클래스에 대해 전역으로 정의된 명령어 처리를 수정했습니다
Target클래스에 대한 전역 정의 명령어 처리를 수정했습니다. 이전에는 두 가지 방법이 있었습니다,operations_for_qargs()와operation_names_for_qargs()는 대상에 존재하는 전역적으로 정의된 이상적인 연산을 무시하거나 잘못 처리했습니다. 예를 들어,from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target(num_qubits=5) target.add_instruction(CXGate()) names = target.operation_names_for_qargs((1, 2)) ops = target.operations_for_qargs((1, 2))이제
names의 경우{"cx"},[CXGate()]의 경우ops을 반환하는 대신KeyError또는 빈 리턴을 반환합니다. -
메서드의 문제를 수정했습니다
Target.add_instruction()메서드에서 이전에는properties인수의 일부로 잘못된 큐비트 수가 포함된 인수를 허용했던 문제를 수정했습니다. 예를 들어,from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target() target.add_instruction(CXGate(), {(0, 1, 2): None})이제 대상과 상호 작용할 때 런타임 문제를 일으키는 대신
TranspilerError이 올바르게 발생합니다. 수정 #8914 -
시각화 기능의 문제를 수정했습니다
plot_state_hinton()시각화 기능의 문제를 수정하여 축이 실제 플롯에서 오프셋되어 잘못 배치되는 문제를 해결했습니다. 수정 #8446 <https://github.com/Qiskit/qiskit/issues/8446> -
함수의 출력을 수정하여
plot_state_hinton()함수의 출력을 수정하여 상태 레이블이 올바르게 정렬되고 이미지가 자연스러운 행렬 순서와 일치하도록 했습니다. 수정 #8324 -
프리미티브 클래스 관련 문제를 수정했습니다,
BackendSampler및BackendEstimator각 작업의 회로 수가 제한된 백엔드에서 실행할 때 발생하는 문제를 수정했습니다. 모든 백엔드가 무제한 배치 크기를 지원하는 것은 아니며(대부분의 하드웨어 백엔드는 지원하지 않습니다) 이전에는 백엔드 프리미티브 클래스가 지원되는 백엔드보다 더 많은 회로를 잘못 전송했을 가능성이 있었습니다. 이 문제는 다음과 같이 수정되었습니다BackendSampler와BackendEstimator는 백엔드에 작업당 회로 수가 제한된 경우 회로를 여러 작업으로 분할합니다. -
클래스 관련 문제를 수정했습니다
BackendEstimator클래스에서 이전에monitor이라는 실행 옵션을True으로 평가되는 값으로 설정하면qiskit-ibmq-provider패키지의 백엔드에서만 작동하는 작업 모니터가 잘못 트리거되던 문제를 수정했습니다. 필요한 경우 문제 없이monitor실행 옵션을 사용할 수 있도록 이 옵션이 제거되었습니다. -
메소드 관련 문제를 수정했습니다
Target.build_coupling_map()메서드가None를 잘못 반환하는 문제를 수정했습니다Target객체에서 전역적으로 사용 가능한 이상적인 명령어와 큐비트 제약 조건이 있는 명령어가 혼합되어 있을 때 발생하는 문제를 수정했습니다. 이제 이러한 경우Target.build_coupling_map()은 제약된 명령어에 대한 커플링 맵을 반환합니다(전역적으로 연결 제약이 없으므로None을 반환하는 2쿼비트 연산이 아니라면). 수정 #8971 -
속성 관련 문제를 수정했습니다
Target.qargsNone어트리뷰트 관련 문제를 수정했습니다Target객체를 반환하는 문제를 수정했습니다. -
pauli_list키워드 인수의 조기 제거를 수정했습니다pauli_basis()함수의 키워드 인수를 조기에 제거하여 키스킷 테라 0.22.0 로 업그레이드할 때pauli_list=True향후 호환성 경로를 사용하는 기존 코드를 깨뜨리는 문제를 수정했습니다. 이 키워드 인수는 함수에 다시 추가되었으며 현재 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. -
QPY 직렬화(
dump())에서 사용자 정의ControlledGate서브클래스가_define()메서드를 오버로드하여 연산에 대한 사용자 정의 정의를 제공할 때 발생하는 문제를 수정했습니다. 이전에는 이 작업 사례가 정의를 제공할 때 잠재적으로_define()메서드를 사용하는 것을 고려하지 않았기 때문에 올바르게 직렬화되지 않았습니다. 수정 #8794 -
QPY 역직렬화는 더 이상 회로에 추가 인스턴스를 추가하지 않습니다
Clbit인스턴스를 회로에 추가하지 않습니다Clbit와 더 많은Qubit보다 많은Clbits. -
QPY 역직렬화는 입력 회로에 느슨한 비트만 포함된 경우 더 이상 q와 c라는 이름의 레지스터를 추가하지 않습니다.
-
두 개의 연산자에서
SparsePauliOp.dot()메서드가 실수 계수가 있는 두 연산자에서 실행될 때 오류가 수정되었습니다. 이 문제를 해결하기 위해SparsePauliOp에서 사용할 수 있는 dtype은np.complex128과object로 제한됩니다. 수정 #8992 -
함수 및
circuit_drawer()함수 및QuantumCircuit.draw()메서드에서mpl출력에 사용할 수 있는 기본 제공 스타일이default뿐인 문제를 수정했습니다.iqx와 같은 다른 기본 제공 스타일을 사용하면 스타일을 찾을 수 없다는 경고가 표시되고 서랍이default스타일을 사용하도록 되돌아갑니다. 수정 #8991 -
문제를 수정했습니다
transpile()인수를 통해 사용자 정의 객체가 전달된 경우TypeError에서 실패하던 문제를 수정했습니다Target객체가target인수를 통해 전달되고circuits인수에 여러 회로 목록이 지정된 경우 문제가 해결되었습니다. -
관련 문제를 수정했습니다
transpile()를 타겟팅할 때Target(target인수를 통해 직접 또는 인수의BackendV2인수를 통해 직접 또는backend인수의 인스턴스를 통해)를 타겟팅할 때 발생하는 문제를 수정했습니다Measure인스트럭션(프로퍼티가 정의되지 않은 인스트럭션)을 타겟팅할 때 발생하는 문제를 수정했습니다. 이전에는 타깃을 구문 분석하려고 할 때 예외가 발생했습니다. 수정 #8969 -
패스와 관련된 문제를 수정했습니다
VF2Layout패스로 실행할 때 오류가 발생하는Target로 실행할 때 오류가 발생하던 문제를 수정했습니다. 이러한 경우 오류율이 없으면 이상적인 구현으로 간주하고 오류율이 없으면 가장 먼저 일치하는 레이아웃을 선택하도록 수정되었습니다. 수정 #8970 -
패스와 관련된 문제를 수정했습니다
VF2PostLayout패스로 실행할 때 오류가 발생하는Target로 실행할 때 오류가 발생하던 문제를 수정했습니다. 이러한 경우 오류율이 없는 것은 이상적인 작업 구현으로 간주됩니다. -
클래스 관련 문제를 수정했습니다
VQD클래스에서k=2고유값이 두 개 이상 계산되는 문제를 수정했습니다. 이전에는 내부 유형 불일치로 인해 실패했지만 이제는 예상대로 실행됩니다. 수정 #8982 -
새로운 프리미티브 기반 변형 알고리즘의 성능 버그 수정
minimum_eigensolvers.VQE,eigensolvers.VQD와SamplingVQE가 기본적으로 에너지 평가를 일괄 처리하지 않아 하드웨어 백엔드를 사용하는 경우 속도가 크게 느려지는 성능 버그를 수정했습니다. -
제로 연산자 게이트 및 명령어는 이제 다음과 함께 작동합니다
circuit_to_gate(),QuantumCircuit.to_gate(),Gate.control()와 함께 작동하며Operator에서QuantumCircuit에서 0 피연산자 인스트럭션이 포함된 이 에지 케이스는 더 큰 복합 명령어의 일부로 전역 위상 게이트를 생성할 때 가끔 유용하지만, 많은 용도에 있어서는QuantumCircuit.global_phase가 더 적절할 수 있습니다. -
다음과 같은 문제 수정
Statevector.evolve()와DensityMatrix.evolve()가 비쿼비트 서브시스템의 중첩된 서브시스템 진화에 대한 예외를 발생시키는 문제를 수정했습니다. 문제 #8897 수정 -
버그 수정
Statevector.evolve()하위 시스템 진화 시 하위 시스템 차원이 다른 진화하지 않은 하위 시스템이 2개 이상 있는 특정 경우에 잘못된 값을 반환하는 버그가 수정되었습니다. 문제 #8899 수정
에어 0.11.1
버그 수정
-
CMake 3.18 이상을 사용하고 GPU 지원을 활성화한 상태에서 qiskit-aer를 빌드하려고 할 때 발생할 수 있는 빌드 오류를 수정했습니다. CMake 3.18 이후부터는 CUDA로 빌드할 때
CMAKE_CUDA_ARCHITECTURES을 타겟 GPU의 아키텍처 값으로 설정해야 했습니다. 이 설정이 없는 경우AER_CUDA_ARCH설정이 사용되도록 수정되었습니다. -
LocalNoisePass에서 클릿으로 명령어를 처리하는 버그를 수정했습니다. 이전에는method="append"의 경우 노이즈가 적용되는 지침(예: 조치)의 일부가 실수로 지워지는 문제가 있었습니다. -
여러 실행에서 동일한 회로로 실행할 때 샘플러 클래스의 성능 오버헤드를 수정했습니다. 이는 후속 실행에서 이러한 동일한 회로의 트랜스필레이션을 건너뛰거나 캐싱함으로써 달성할 수 있었습니다.
-
및 프리미티브 클래스의 호환성을 수정했습니다
Sampler및Estimator프리미티브 클래스와 키스킷-테라 0.22.0 릴리스와의 호환성을 수정했다. Qiskit-terra 0.22.0 에서 이러한 클래스와의 호환성을 깨뜨리는 추상 인터페이스의 API 변경이 이루어졌는데, 이 문제가 해결되었다Sampler와Estimator는 이제 qiskit-terra >= 0.22.0 와 함께 사용할 수 있습니다.
IBM Q 제공자 0.19.2
변경 없음
0.39.0
이번 릴리스에서는 키스킷 메타패키지의 일부인 키스킷 에어 프로젝트도 공식적으로 더 이상 사용되지 않습니다. 즉, 향후 릴리스에서 pip install qiskit 에는 더 이상 qiskit-aer 이 포함되지 않습니다. 현재 qiskit 을 설치하거나 종속성으로 나열하여 Aer를 설치하는 경우 qiskit-aer 도 명시적으로 나열하도록 업그레이드해야 합니다.
qiskit-aer 프로젝트는 여전히 활성화되어 있고 앞으로도 유지될 것이지만, 키스킷 메타패키지(즉, pip install qiskit 을 통해 설치되는 것)의 경우 키스킷 패키지는 양자 회로, 프로그램 및 애플리케이션을 구축하고 컴파일하는 공통 핵심 기능만 포함하고, 이를 기반으로 구축하거나 하드웨어 또는 시뮬레이터에 키스킷을 연결하는 패키지는 별도의 패키지로 구성하는 모델로 나아가고 있습니다.
테라 0.22.0
Prelude
키스킷 테라 0.22.0 릴리즈는 수많은 새로운 기능과 버그 수정이 포함된 주요 기능 릴리즈입니다. 이번 릴리스의 주요 내용은 다음과 같습니다:
- 트랜스파일링에 대한 트랜스파일러 초기 지원 추가
QuantumCircuit객체와 같은 제어 흐름 명령어를 포함하는ForLoopOp및WhileLoopOp.- 특히 많은 큐비트를 사용하는
transpile()함수의 확장 및 성능이 크게 개선되었습니다(특히optimization_level=3사용 시).- 외부 플러그인 인터페이스
transpile()외부 패키지에서 기본 패스 관리자를 위한 스테이지를 구현할 수 있습니다. 이에 대한 자세한 내용은qiskit.transpiler.preset_passmanagers.plugin. 또한BackendV2백엔드에서는 이제 스케줄링 및 번역 단계에 사용할 사용자 지정 기본 플러그인을 선택적으로 설정할 수 있습니다.- 업데이트된 알고리즘 구현
qiskit.algorithms의 업데이트된 알고리즘 구현primitives클래스를 구현하는BaseSampler와BaseEstimator.
새 기능
-
클래스에 가변 폭을 갖는 연산 표현을 위한 지원을 추가합니다
Target클래스에 추가합니다. 이전에는Target객체에는 대상에서 지원되는 각 작업에 대해Operation인스턴스가 정의되어 있어야 했습니다. 이는 인수의 유효성 검사와 연산 매개변수 검증에 모두 사용되었습니다. 그러나 가변 폭을 갖는 연산에서는Operation클래스의 각 인스턴스가 고정된 수의 큐비트만 가질 수 있기 때문에 이것이 불가능했습니다. 백엔드에서 가변 너비 연산을 지원하는 경우 인스턴스 대신 연산 클래스와 함께 인스트럭션을 추가할 수 있습니다. 이러한 경우 작업은 모든 큐비트에서 전역적으로 지원되는 것으로 처리됩니다. 예를 들어 다음과 같은 타겟을 구축하는 경우from qiskit.circuit import Parameter, Measure, IfElseOp, ForLoopOp, WhileLoopOp from qiskit.circuit.library import IGate, RZGate, SXGate, XGate, CXGate from qiskit.transpiler import Target, InstructionProperties theta = Parameter("theta") ibm_target = Target() i_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(IGate(), i_props) rz_props = { (0,): InstructionProperties(duration=0, error=0), (1,): InstructionProperties(duration=0, error=0), (2,): InstructionProperties(duration=0, error=0), (3,): InstructionProperties(duration=0, error=0), (4,): InstructionProperties(duration=0, error=0), } ibm_target.add_instruction(RZGate(theta), rz_props) sx_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(SXGate(), sx_props) x_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(XGate(), x_props) cx_props = { (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713), (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713), (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929), (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929), (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659), (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659), (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201), (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201), } ibm_target.add_instruction(CXGate(), cx_props) measure_props = { (0,): InstructionProperties(duration=5.813e-6, error=0.0751), (1,): InstructionProperties(duration=5.813e-6, error=0.0225), (2,): InstructionProperties(duration=5.813e-6, error=0.0146), (3,): InstructionProperties(duration=5.813e-6, error=0.0215), (4,): InstructionProperties(duration=5.813e-6, error=0.0333), } ibm_target.add_instruction(Measure(), measure_props) ibm_target.add_instruction(IfElseOp, name="if_else") ibm_target.add_instruction(ForLoopOp, name="for_loop") ibm_target.add_instruction(WhileLoopOp, name="while_loop")그리고
IfElseOp,ForLoopOp및WhileLoopOp연산은 모든 수의 큐비트에 대해 전 세계적으로 지원됩니다. 그런 다음 다음과 같은 다른 호출에 의해 반영됩니다TargetAPI의 다른 호출에instruction_supported():ibm_target.instruction_supported(operation_class=WhileLoopOp, qargs=(0, 2, 3, 4)) ibm_target.instruction_supported('if_else', qargs=(0, 1))둘 다
True을 반환합니다. -
새로운 프리미티브 구현이 추가되었습니다,
BackendSampler와BackendEstimator를qiskit.primitives. 이 새로운 프리미티브 클래스 구현은BackendV1또는BackendV2인스턴스를BaseSampler또는BaseEstimator로 래핑합니다. 이러한 기본 구현의 사용 사례는 기본 기본 구현이 없는 공급자와 기본 구현과 함께 작동하는 API를 사용하는 공급자의 백엔드 간의 격차를 해소하기 위한 것입니다. 예를 들어SamplingVQE클래스는BaseSampler인스턴스가 필요합니다. 네이티브 프리미티브 구현이 없는 공급자의 백엔드로 해당 클래스를 실행하고 싶다면BackendSampler를 생성하면 됩니다:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import BackendSampler from qiskit.providers.fake_provider import FakeHanoi from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp backend = FakeHanoi() sampler = BackendSampler(backend=backend) operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalue네이티브 프리미티브 구현이 있는 공급자(예:
qiskit-ibm-runtime또는qiskit-aer)를 사용하는 경우 항상 네이티브 프리미티브 구현을 사용하는 것이 좋습니다BackendEstimator또는BackendSampler보다 네이티브 구현이 훨씬 효율적이거나 추가 사전 및 사후 처리를 수행할 수 있기 때문입니다.BackendEstimator와BackendSampler는 반환하는 모든 백엔드에서 작동할 수 있는 범용으로 설계되었습니다CountsResults를 반환하는 모든 백엔드에서 작동할 수 있는 범용으로 설계되어 추가 최적화가 필요하지 않습니다. -
새로운 알고리즘 클래스를 추가했습니다,
AdaptVQE에qiskit.algorithms이 알고리즘은qiskit.algorithms.minimum_eigensolvers.VQE와 연산자 풀을 조합하여qiskit.circuit.library.EvolvedOperatorAnsatz연산자 풀과 조합하여 사용합니다. 예를 들어,from qiskit.algorithms.minimum_eigensolvers import AdaptVQE, VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.primitives import Estimator from qiskit.circuit.library import EvolvedOperatorAnsatz # get your Hamiltonian hamiltonian = ... # construct your ansatz ansatz = EvolvedOperatorAnsatz(...) vqe = VQE(Estimator(), ansatz, SLSQP()) adapt_vqe = AdaptVQE(vqe) result = adapt_vqe.compute_minimum_eigenvalue(hamiltonian) -
클래스는 이제
BackendV2클래스는 이제 두 개의 새로운 선택적 훅 포인트를 지원하여 백엔드에서 사용자 정의 컴파일 단계를 삽입할 수 있습니다transpile()와generate_preset_pass_manager(). 구현에BackendV2구현에get_scheduling_stage_plugin()또는get_translation_stage_plugin()메서드가 포함된 경우 트랜스파일러는 반환된 문자열을scheduling_method및translation_method인수의 기본값으로 사용합니다. 이를 통해 백엔드에서 트랜스파일러 스테이지를 활용하여 해당 백엔드를 타겟팅할 때 추가 커스텀 트랜스파일러 패스를 실행할 수 있습니다plugin인터페이스를 활용할 수 있습니다. 사용 방법에 대한 자세한 내용은 다음을 참조하세요: 커스텀 트랜스파일러 패스를 참고하세요. -
새 키워드 인수
ignore_backend_supplied_default_methods를 추가했습니다transpile()함수에 새로운 키워드 인수인get_scheduling_stage_plugin()또는get_translation_stage_plugin()을 추가하여 대상 백엔드에 또는 이 정의되어 있는 경우 백엔드의 기본 방법 사용자 지정 선택을 비활성화하는 데 사용할 수 있습니다. -
클래스의 생성자에
label파라미터를 추가했습니다Barrier클래스의 생성자 및barrier()메서드에 사용자가 레이블을 지정할 수 있는Barrier지시어의 인스턴스에 레이블을 할당할 수 있는 메서드를 추가했습니다. 를 사용하여 생성된 비주얼리제이션의 경우circuit_drawer()또는QuantumCircuit.draw()로 생성된 시각화의 경우 이 레이블은barrier의 상단에 인쇄됩니다.from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.h(1) circuit.barrier(label="After H") circuit.draw('mpl') -
새 게이트 추가
CCZGate,CSGate및CSdgGate를 회로 라이브러리의 표준 게이트(qiskit.circuit.library). -
추가
qiskit.algorithms.eigensolvers패키지에 프리미티브 지원 알고리즘을 위한 인터페이스를 추가했습니다. 이 새 모듈은 결국 이전qiskit.algorithms.eigen_solvers을 대체하게 됩니다. 이 새로운 모듈에는 백엔드나VQD의 대체 구현이 포함되어 있으며, 백엔드 또는QuantumInstance의 인스턴스를 취하는 대신BaseEstimator의 인스턴스(예Estimator,BackendEstimator또는qiskit-ibm-runtime및qiskit-aer에 있는 것과 같은 모든 공급자 구현을 포함합니다.예를 들어, 새 구현을 다음과 같은 인스턴스와 함께 사용하려면
Estimator클래스의 인스턴스와 함께 사용하려면from qiskit.algorithms.eigensolvers import VQD from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler, Estimator from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp h2_op = PauliSumOp(SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], )) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() fidelity = ComputeUncompute(Sampler()) vqd = VQD(estimator, fidelity, ansatz, optimizer, k=2) result = vqd.compute_eigenvalues(h2_op) eigenvalues = result.eigenvalues평가된 보조 연산자는 이제 결과의
aux_operators_evaluated필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다.aux_operator_eigenvalues는 더 이상 유효한 필드가 아닙니다. -
양자 회로 쌍의 상태 충실도/중첩을 계산하는 새로운 알고리즘이 추가되었습니다(매개변수화 가능). 인터페이스를 정의하는 베이스 클래스(
BaseStateFidelity)의 인스턴스를 활용하는 계산-계산 해제 메서드의 구현이 있는데, 인터페이스를 정의하는 베이스 클래스(BaseSampler프리미티브qiskit.algorithms.state_fidelities.ComputeUncompute.예를 들어,
import numpy as np from qiskit.primitives import Sampler from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.circuit.library import RealAmplitudes sampler = Sampler(...) fidelity = ComputeUncompute(sampler) circuit = RealAmplitudes(2) values = np.random.random(circuit.num_parameters) shift = np.ones_like(values) * 0.01 job = fidelity.run([circuit], [circuit], [values], [values+shift]) fidelities = job.result().fidelities -
새로운 모듈이 추가되었습니다
qiskit.algorithms.gradients에 정의된 프리미티브 인터페이스를 사용하여 그라디언트를 계산하는 데 사용되는 클래스를 포함하는 새로운 모듈이 추가되었습니다qiskit.primitives. 그라데이션 클래스에는 4가지 유형이 있습니다: 유한차이, 파라미터 시프트, 유니티의 선형 조합, 그리고 SPSA의 인스턴스를 사용하는 구현이 있는BaseEstimator인터페이스의 인스턴스를 사용합니다:의 인스턴스 또는
BaseSampler인터페이스의 인스턴스입니다:추정기 기반 기울기는 기대값의 기울기를 계산하는 반면 샘플러 기반 기울기는 측정 결과의 기울기("확률 기울기"라고도 함)를 반환합니다.
예를 들어,
estimator = Estimator(...) gradient = ParamShiftEstimatorGradient(estimator) job = gradient.run(circuits, observables, parameters) gradients = job.result().gradients -
클래스에는
Grover클래스에는 새로운 키워드 인수가 있는데,sampler이 인수는 결과를 계산하기 위해 인터페이스의 인스턴스를 사용하여 알고리즘을 실행하는 데 사용됩니다BaseSampler인터페이스의 인스턴스를 사용하여 알고리즘을 실행하는 데 사용됩니다. 이 새 인수는quantum_instance인수를 대체하며, 따라서quantum_instance인수는 사용 중단 대기 중이며 향후 릴리스에서 사용 중단 및 제거될 예정입니다.예:
from qiskit import QuantumCircuit from qiskit.primitives import Sampler from qiskit.algorithms import Grover, AmplificationProblem sampler = Sampler() oracle = QuantumCircuit(2) oracle.cz(0, 1) problem = AmplificationProblem(oracle, is_good_state=["11"]) grover = Grover(sampler=sampler) result = grover.amplify(problem) -
새로운 옵션인
"formatter.control.fill_waveform"이 펄스 서랍(pulse_v2.draw()및Schedule.draw()) 스타일 시트에 추가되었습니다. 이 옵션을 사용하면 출력 시각화에서 펄스의 얼굴 색을 제거하여 선으로만 펄스를 그릴 수 있습니다.예를 들어,
from qiskit.visualization.pulse_v2 import IQXStandard my_style = IQXStandard( **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2} ) my_sched.draw(style=my_style) -
새로운 트랜스파일러 패스를 추가했습니다,
ResetAfterMeasureSimplification라는 새로운 트랜스파일러 패스가 추가되었는데, 이 패스는Reset연산 뒤에Measure를 조건부XGate. 이 패스는 백엔드에서 측정을 수행한 다음 조건부 X 게이트를 통해Reset연산을 수행한 다음 조건부 X 게이트를 수행하여 중복된 암시적 중첩을 제거할 수 있도록Measure연산에서Reset연산에서 중복을 제거합니다. 예를 들어,from qiskit import QuantumCircuit from qiskit.transpiler.passes import ResetAfterMeasureSimplification qc = QuantumCircuit(1) qc.measure_all() qc.reset(0) qc.draw('mpl')result = ResetAfterMeasureSimplification()(qc) result.draw('mpl') -
entanglement키워드 인수에 대해 지원되는 새로운 값"reverse_linear"을 회로 클래스의 생성자에 추가했습니다NLocal회로 클래스의 생성자에 의 경우TwoLocal회로( 의 서브 클래스인NLocal)의 하위 클래스인 경우(entanglement_blocks="cx"),entanglement="reverse_linear"을 사용하면entanglement="full"과 동등한 n-큐비트 회로가 제공되지만CXGate게이트만 사용합니다. -
ScheduleBlock는 할당되지 않은 하위 루틴을 관리할 수 있도록, 즉 다른 프로그램의 지연 호출을 허용하도록 업데이트되었습니다. 예를 들어 다음과 같은 워크플로우를 사용할 수 있습니다:from qiskit import pulse with pulse.build() as prog: pulse.reference("x", "q0") with pulse.build() as xq0: pulse.play(Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) prog.assign_references({("x", "q0"): xq0})이제 사용자는 참조
("x", "q0")의 실제 구현을 알지 못해도prog을 생성하고 나중에 실행을 위해 할당할 수 있습니다. 이렇게 하면 펄스 프로그램의 모듈성이 향상되므로 다른 캘리브레이션에 의존하는 템플릿 펄스 프로그램을 쉽게 작성할 수 있습니다.이 기능을 구현하기 위해 새로운 펄스 명령어(컴파일러 지시어)
Reference가 추가되었습니다. 이 명령은 현재 빌더 스코프에 주입됩니다reference()명령이 사용될 때 주입됩니다. 현재 펄스 프로그램에 정의된 모든 참조는references속성을 사용하여 나열할 수 있습니다.또한 모든 참조는 스코프를 통해 관리되므로 매개변수를 쉽게 관리할 수 있습니다.
scoped_parameters()및search_parameters()에 추가되었습니다ScheduleBlock. 자세한 내용은 API 설명서를 참조하세요. -
새로운 메서드
SparsePauliOp.argsort()메서드를 추가하여 계수를 기준으로 정렬하고 폴리를 기준으로 정렬하는 순서로 순열의 구성을 반환합니다. 메서드에weight키워드 인수를 사용하면 폴리에 있는 비동일성 용어의 수에 따라 출력을 추가로 정렬할 수 있으며, 여기서 주어진 가중치의 모든 폴리 집합은 여전히 사전순으로 정렬됩니다. -
새로운 메서드
SparsePauliOp.sort()를 사용하여 계수를 정렬하는 메서드가 추가되었는데, 이 메서드는 먼저 numpy의argsort()를 사용하여 계수를 정렬한 다음 폴리를 기준으로 정렬하며, 폴리 정렬이 우선합니다. 폴리 정렬이 동일하면 계수별로 정렬됩니다.weight키워드 인수를 사용하면 폴리에 있는 비동일성 용어의 수에 따라 출력을 추가로 정렬할 수 있으며, 여기서 주어진 가중치의 모든 폴리 집합은 여전히 사전순으로 정렬됩니다. -
함수에 새로운 키워드 인수
wire_order를 추가했습니다circuit_drawer()함수와QuantumCircuit.draw()메서드에 새로운 키워드 인수를 추가하여 출력 시각화에서 양자 비트와 기존 비트의 순서를 임의로 변경할 수 있습니다. 예를 들어,from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(4, "q") cr = ClassicalRegister(4, "c") cr2 = ClassicalRegister(2, "ca") circuit = QuantumCircuit(qr, cr, cr2) circuit.h(0) circuit.h(3) circuit.x(1) circuit.x(3).c_if(cr, 10) circuit.draw('mpl', cregbundle=False, wire_order=[2, 1, 3, 0, 6, 8, 9, 5, 4, 7]) -
에 대한 지원이 추가되었습니다
CSGate,CSdgGate및CCZGate클래스에 대한 지원을 연산자 클래스의 생성자CNOTDihedral. 연산자를 생성할 때 입력 회로는CNOTDihedral연산자는 이제 이러한 게이트를 사용하는 회로를 지원합니다. 예를 들어,from qiskit import QuantumCircuit from qiskit.quantum_info import CNOTDihedral qc = QuantumCircuit(2) qc.t(0) qc.cs(0, 1) qc.tdg(0) operator = CNOTDihedral(qc) -
진폭 추정 알고리즘 클래스입니다:
이제 생성자에 새로운 키워드 인자
sampler가 추가되어 객체의 인스턴스인BaseSampler인터페이스 또는BackendSampler,Sampler, 또는 qiskit-ibm-runtime 및 qiskit-aer에 있는 것과 같은 모든 공급자 구현을 포함한다. 이는quantum_instance인수를 사용하여 대상을 설정하는 대신Backend또는QuantumInstance를 사용하여 알고리즘을 실행할 수 있습니다. 사용QuantumInstance는 사용 중단 대기 중이며 향후 릴리스에서 사용 중단될 예정입니다. -
새 클래스를 추가했습니다,
BackendV2Converter인스턴스를 래핑하는 데 사용되는BackendV1인스턴스를BackendV2인터페이스에 인스턴스를 감싸는 데 사용되는 클래스를 추가했습니다. 이를 통해 어느 곳에서나BackendV2인스턴스를BackendV1. 이를 통해 최신 인터페이스에서 액세스 패턴을 표준화할 수 있습니다BackendV2인터페이스를 지원하더라도BackendV1. -
새로운 기능 추가
convert_to_target()를 가져오는 데 사용되는BackendConfiguration및 선택적으로BackendProperties와PulseDefaults를 가져와서 해당 객체의 내용에 해당하는Target객체를 생성하는 함수를 추가했습니다. -
qiskit.quantum_info.BaseOperator서브클래스(ScalarOp,SparsePauliOp및PauliList)는 이제 내장된 Pythonsum()함수와 함께 사용할 수 있습니다. -
새로운 트랜스파일러 패스가 추가되었습니다,
ConvertConditionsToIfOps가 추가되어 구식 조건부 명령어를Instruction.c_if()-조건부 명령어를IfElseOp객체로 변환하는 데 사용할 수 있습니다. 이는 백엔드에서 이전 유형에서 새 유형으로 쉽게 전환할 수 있도록 돕기 위한 것입니다. 대부분의 사용자에게는 패스 매니저에 추가할 필요가 없으며, 사전 설정된 패스 매니저에도 포함되어 있지 않습니다. -
게이트 정류성 분석을 클래스로 리팩터링했습니다
CommutationChecker. 이 클래스를 사용하면 두 게이트의 통근 여부를 (행렬 곱셈을 기반으로) 확인하고 결과를 캐시할 수 있습니다(나중에 유사한 검사를 할 때 더 이상 행렬 곱셈이 필요하지 않도록).예를 들어 이제 할 수 있습니다:
from qiskit.circuit import QuantumRegister, CommutationChecker comm_checker = CommutationChecker() qr = QuantumRegister(4) res = comm_checker.commute(CXGate(), [qr[1], qr[0]], [], CXGate(), [qr[1], qr[2]], [])두 개의 CX 게이트가 오가면서(첫 번째 CX 게이트는
qr[1]과qr[0], 두 번째 CX 게이트는qr[1]과qr[2]),res이True이 됩니다.이 정류성 검사는 조건부 및 매개변수화된 게이트의 경우 지나치게 보수적이며, 이러한 게이트가 정류하는 경우에도
False을 반환할 수 있습니다. -
새로운 트랜스파일러 패스를 추가했습니다
CommutativeInverseCancellation를 추가하여 게이트 간 정류 관계를 이용하는 역게이트 쌍을 취소합니다. 이 패스는 트랜스파일러 패스의 일반화입니다InverseCancellation를 일반화한 것으로, 더 큰 역 게이트 집합을 감지하고 정류성을 고려하기 때문입니다. 이 패스는 또한 트랜스파일러 패스와 관련된 몇 가지 문제를 방지합니다CommutativeCancellation.예를 들어,
from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(2) circuit.z(0) circuit.x(1) circuit.cx(0, 1) circuit.z(0) circuit.x(1) passmanager = PassManager(CommutativeInverseCancellation()) new_circuit = passmanager.run(circuit)는 한 쌍의 자기 역 Z 게이트와 한 쌍의 자기 역 X 게이트(해당 게이트가 CX 게이트와 통근하므로)를 취소하여 단일 CX 게이트로 구성된 회로를 생성합니다.
역검사는 조건부 및 매개변수화된 게이트에 대해 지나치게 보수적이며, 이러한 게이트 중 일부는 취소되지 않을 수 있습니다.
-
QuantumCircuit.compose()는 이제 기본 회로 자체에 비트가 없는 경우 클래식 비트가 있는 피연산자를 허용합니다. 이제 양자 전용 회로에 측정값으로 회로를 구성하는 패턴이 유효합니다. 예를 들어,from qiskit import QuantumCircuit base = QuantumCircuit(3) terminus = QuantumCircuit(3, 3) terminus.measure_all() # This will now succeed, though it was previously a CircuitError. base.compose(terminus) -
메서드의
DAGCircuit메서드depth()와size()에는 제어 흐름 연산을 포함하는 회로에 사용할 수 있는 새로운recurse키워드 인수가 있습니다(IfElseOp,WhileLoopOp및ForLoopOp). 기본값은False이며, 제어 흐름 연산이 있는 경우 잘못 정의된 결과를 방지하기 위해 오류를 발생시킵니다.True로 설정하면 일반적으로 구체적인 실행의 깊이나 크기를 알 수 없더라도 각 제어 흐름 블록의 상태를 기준으로 공정하게 가중치를 부여하는 프록시 값이 반환됩니다. 각 제어 흐름 연산이 출력에 미치는 영향은 각 메서드의 설명서를 참조하세요. -
DAGCircuit.count_ops()는 제어 흐름 블록으로 리커싱하기 위한recurse키워드 인수를 얻었습니다. 기본값은True이며, 모든 블록의 모든 연산과 제어 흐름 연산 자체가 반환됩니다. -
함수에
create_preds_and_succs인수를 추가했습니다circuit_to_dagdependency()와dag_to_dagdependency()에서 변환하는QuantumCircuit과DAGCircuit에서 각각DAGDependency.create_preds_and_succs값이 False인 경우, 다음의 노드에 대한 전이 전임자와 후속 노드인DAGDependency의 노드에 대한 전이 전임자와 후임자가 구성되지 않으므로 변환 속도가 빨라지고 메모리 사용량이 훨씬 줄어듭니다. 의 노드에 대한 직접 전임자와 후임자는 기존과 같이DAGDependency의 노드의 직접 전임자와 후임자는 평소와 같이 구성됩니다.예를 들어,
from qiskit.converters import circuit_to_dagdependency from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in, create_preds_and_succs=False) -
새로운 속성 추가
Clifford.symplectic_matrix,Clifford.tableau,Clifford.z,Clifford.x,Clifford.phase,Clifford.stab,Clifford.stab_z,Clifford.stab_x,Clifford.stab_phase,Clifford.destab,Clifford.destab_z,Clifford.destab_x,Clifford.destab_phase클래스에Clifford클래스에 추가합니다. 향후 더 이상 사용되지 않는Clifford.table대신 사용할 수 있습니다.StabilizerTable및PauliTable은 사용 중단 대기 중이며 향후 릴리스에서 사용 중단되고 그 이후에는 제거될 예정입니다. -
이제
Commuting2qGateRouter생성자에는 이제 새로운 키워드 인자edge_coloring가 추가되었습니다. 이 인수는 커플링 맵의 가장자리 색상을 제공하여 커뮤팅 게이트가 적용되는 순서를 결정하는 데 사용됩니다. -
프리미티브를 사용하여 시간 진화 알고리즘을 생성하기 위한 새로운 알고리즘 인터페이스가 추가되었습니다
BaseSampler과BaseEstimator. 이 새로운 인터페이스는 다음과 같이 구성됩니다:이 새로운 인터페이스는 기존의 시간 진화 알고리즘 인터페이스를 대체하여
EvolutionProblem,EvolutionResult,RealEvolver및ImaginaryEvolver와 함께 작동했던QuantumInstance객체로 작동했습니다. 이 새로운 인터페이스는 향후 릴리스에서 더 이상 사용되지 않고 제거될 이전 인터페이스를 대체합니다. -
에 새로운 백엔드 클래스를 추가했습니다
qiskit.providers.fake_provider:이 새로운 클래스는
BackendV2인터페이스를 구현하며 각각 IBM Quantum 시스템ibm_auckland,ibm_oslo,ibm_geneva,ibm_perth시스템에서 백엔드 정보의 저장된 스냅샷을 사용하여 만들어집니다. -
클래스의
Z2Symmetries클래스에는 두 가지 새로운 메서드가 있습니다,convert_clifford()와taper_clifford(). 이 두 가지 메서드는 객체의 Z2 대칭을 기반으로 연산자를 테이퍼링하는 데 필요한 두 가지 연산이며, 이전에는 내부적으로taper()메서드를 통해 내부적으로 수행되었습니다. 그러나 이러한 메서드는 이제 클래스의 공용 메서드로서 필요한 경우 개별적으로 호출할 수 있습니다. -
긴 객체의 활용에 대한 런타임 성능
PauliList객체를Clifford를 사용하여PauliList.evolve()의 런타임 성능이 크게 향상되었습니다. 이제 이전보다 훨씬 빠르게 실행됩니다. -
모듈에 새로운 추상 클래스
ClassicalIOChannel를 추가했습니다qiskit.pulse.channels모듈에 추가했습니다. 이 클래스는 고전적인 I/O 채널을 나타내고 이러한 채널을 다른Channel. 이 새로운 클래스는MemorySlot,RegisterSlot및SnapshotChannel클래스의 베이스 클래스입니다. 따라서pad()의 표준화 펄스 변환qiskit.pulse.transforms의 표준화 펄스 변환은 다음과 같은 인스턴스에 지연을 일으키지 않습니다ClassicalIOChannel -
트랜스파일러 패스의
SabreSwap트랜스파일러 패스의 생성자에는 새로운 키워드 인수가 있습니다(trials).trials인수는 시도할 무작위 시드 시도 횟수를 지정하는 데 사용됩니다. 난수에 사용된 시드에 따라 SABRE 알고리즘의 출력은 크게 달라질 수 있습니다.SabreSwap는 이제trials수의 무작위 시드를 사용하여 알고리즘을 실행하고 가장 적합한(가장 적은 수의 스왑이 삽입된) 시드를 선택합니다.trials을 지정하지 않으면 기본적으로 로컬 시스템의 물리적 CPU 수를 사용하도록 패스가 설정됩니다. -
트랜스파일러 패스의
SabreLayout트랜스파일러 패스의 생성자에는 새로운 키워드 인수가 있습니다(swap_trials).swap_trials인수는 내부적으로 패스에서 실행할 무작위 시드 시도 횟수를 지정하는 데 사용됩니다SabreSwap패스를 내부적으로 전달합니다. 패스의trials아루그먼트에 해당합니다SabreSwap패스. 설정하면, 각 반복은SabreSwap의 각 반복이 내부적으로swap_trials번 실행됩니다.swap_trials을 지정하지 않으면 기본적으로 로컬 시스템의 물리적 CPU 수를 사용합니다. -
새로운 함수가 추가되었습니다,
estimate_observables()의 구현을 사용하는BaseEstimator인터페이스 구현(예Estimator,BackendEstimator또는qiskit-ibm-runtime및qiskit-aer)에 있는 것과 같은 공급자 구현을 사용하여 관측값 목록 또는 사전에서 기대값, 평균 및 표준 편차를 계산합니다. 이는 기존 함수와 유사한 목적을 가지고 있습니다eval_observables()객체를 사용하여 계산을 수행했던 기존 함수QuantumInstance객체를 사용하여 계산을 수행했던 기존 함수와 유사한 용도로 사용되며, 이 새로운 함수로 대체되었습니다(향후 릴리스에서 더 이상 사용되지 않고 제거될 예정입니다). -
새로운
Operation베이스 클래스를 추가하여 객체에 대한 경량 추상 인터페이스를 제공합니다QuantumCircuit. 이를 통해 "상위 수준" 객체를 회로에 직접 저장하고(예를 들어Clifford객체), 그러한 객체를 직접 결합하고(예를 들어, 동일한 큐비트 위에 여러 개의 연속된Clifford객체), 런타임에 이러한 객체를 합성(예를 들어, 깊이 최적화 및/또는 장치 연결을 활용하는 방식으로Clifford깊이를 최적화하거나 디바이스 연결을 활용하는 방식으로). 이전에는qiskit.circuit.Instruction의 서브클래스만QuantumCircuit의 서브클래스만 사용할 수 있었지만, 이 인터페이스는 다루기 어렵고 범용 객체를 위한 메서드와 속성이 너무 많이 포함되어 있습니다.새로운
Operation인터페이스에는name,num_qubits및num_clbits(향후 약간 조정될 수 있음)이 포함되지만, 중요한 것은definition(따라서 합성을 객체에 연결하지 않음),condition(별도의 클래식 제어 흐름의 일부여야 함),duration및unit(트랜스파일러 출력의 속성이므로)이 포함되지 않는다는 점입니다.현재 기준입니다,
Operation포함Gate,Reset,Barrier,Measure와 같은 "상위 수준" 객체와Clifford. 이 '상위 수준' 객체 목록은 앞으로 더 늘어날 예정입니다. -
A
Clifford는 이제 이 클리포드를 구현하는 하위 회로를 합성하지 않고도 양자 회로에Operation로 추가할 수 있으며, 이 클리포드를 구현하는 서브 회로를 먼저 합성하지 않아도 됩니다. 실제 합성은 나중으로 연기됩니다HighLevelSynthesis트랜스필레이션 패스로 연기됩니다.예를 들어 다음 코드가 있습니다:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford qc = QuantumCircuit(3) cliff = random_clifford(2) qc.append(cliff, [0, 1])는 더 이상
cliff를qiskit.circuit.Instruction에 추가될 때 클리포드를 회로로 합성하는 것을 포함하여qc으로 변환합니다. -
새로운 트랜스파일러 패스 추가
OptimizeCliffords를 추가하여 회로에서 연속된 오브젝트 블록을Clifford오브젝트 블록을 수집하고 각 블록을 하나의Clifford.예를 들어 다음 코드가 있습니다:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler.passes import OptimizeCliffords from qiskit.transpiler import PassManager qc = QuantumCircuit(3) cliff1 = random_clifford(2) cliff2 = random_clifford(2) qc.append(cliff1, [2, 1]) qc.append(cliff2, [2, 1]) qc_optimized = PassManager(OptimizeCliffords()).run(qc)는 먼저
qc에cliff1와cliff2두 개의 클리포드를 "상위 수준" 객체로 저장한 다음, 트랜스파일러 패스OptimizeCliffords는 이 두 클리포드를 하나의 클리포드로 구성하여 회로를 최적화합니다. 결과물인 클리포드는 여전히qc에 상위 레벨 객체로 저장됩니다. 이 패스는 아직 사전 설정 패스 매니저에 포함되어 있지 않습니다. -
새로운 트랜스파일러 패스가 추가되었습니다
HighLevelSynthesis를 추가하여 상위 레벨 객체(예를 들어,Clifford오브젝트).예를 들어 다음 코드가 있습니다:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler import PassManager from qiskit.transpiler.passes import HighLevelSynthesis qc = QuantumCircuit(3) qc.h(0) cliff = random_clifford(2) qc.append(cliff, [0, 1]) qc_synthesized = PassManager(HighLevelSynthesis()).run(qc)는 기본
decompose_clifford()함수를 사용하여qc에 저장된 상위 수준의 클리포드를 합성합니다.이 새로운 트랜스파일러 패스
HighLevelSynthesis는 프리셋 패스 관리자에 통합되어 바로 뒤에 실행되며UnitarySynthesis패스. 따라서transpile()는 회로에 존재하는 모든 상위 클리포드를 합성합니다.객체를 "상위 수준" 객체로 저장하는 작업은
Clifford객체를 "상위 수준" 객체로 저장하고 이러한 객체를 트랜스파일하기 위해HighLevelSynthesis패스를 사용하여 이러한 객체를 투명하게 만드는 작업은 완전히 투명해야 하며 코드를 변경할 필요가 없습니다. -
SparsePauliOp는 이제 일반적인 Python 객체인 계수 배열로 구성할 수 있습니다. 이것은 다음과 함께 사용하기 위한 것입니다ParameterExpression객체와 함께 사용하기 위한 것입니다. 다른 객체는 작동할 수 있지만 일급 지원은 제공되지 않습니다. 일부SparsePauliOp메서드(다른 클래스 표현으로의 변환 등)는object배열을 사용할 때 원하는 대상이 이러한 일반 배열을 나타낼 수 없는 경우 작동하지 않을 수 있습니다.예를 들어
ParameterExpressionSparsePauliOp로 구성할 수 있습니다:import numpy as np from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp print(SparsePauliOp(["II", "XZ"], np.array([Parameter("a"), Parameter("b")])))는
SparsePauliOp(['II', 'XZ'], coeffs=[ParameterExpression(1.0*a), ParameterExpression(1.0*b)]) -
새로운 함수 추가
plot_distribution()함수를 추가했습니다.Counts,QuasiDistribution,ProbDistribution에 적합합니다. 원시 딕셔너리도 전달할 수 있습니다. 예를 들어,from qiskit.visualization import plot_distribution quasi_dist = {'0': .98, '1': -.01} plot_distribution(quasi_dist) -
새로운 하이 레벨 합성 플러그인 인터페이스를 도입하여 외부 패키지에 포함된 대체 합성 기법을 트랜스파일러 패스와 함께 원활하게 사용할 수 있습니다
HighLevelSynthesis트랜스파일러 패스. 이러한 대체 합성 기법은 "상위 수준" 객체 유형에 대해 지정할 수 있습니다Operation의 "상위 수준" 객체에 대해 지정할 수 있습니다(예Clifford및LinearFunction객체에 대해 지정할 수 있습니다. 이 플러그인 인터페이스는 단일 합성을 위한 인터페이스와 유사합니다. 후자의 경우 새 플러그인 작성에 대한 자세한 내용은qiskit.transpiler.passes.synthesis.plugin모듈 문서를 참고하세요. -
유형의 "상위 수준" 객체에 대한 대체 합성 알고리즘을 지정하는 데 사용할 수 있는 새로운 클래스
HLSConfig를 도입했습니다Operation. 관심 있는 각 상위 수준 객체에 대해HLSConfig객체는 합성 메서드 목록과 해당 인수를 지정합니다. 이 객체는HighLevelSynthesis트랜스파일러 패스로 전달하거나hls_config에서 파라미터로 지정할 수 있습니다transpile().예를 들어
op_a와op_b이 두 개의 상위 레벨 객체의 이름이고,op_a-객체에는 추가 파라미터가 필요한 두 개의 합성 메서드default와 선택적 정수 파라미터option_1와option_2가 있는other,op_b-객체에는 단일 합성 메서드default가 있으며,qc는op_a와op_b객체를 포함하는 양자 회로라고 가정해 봅시다. 다음 코드 스니펫입니다:hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})]) pm = PassManager([HighLevelSynthesis(hls_config=hls_config)]) transpiled_qc = pm.run(qc)는
op_b-객체에 대해 대체 합성 방법other을 실행하고,op_a-객체를 포함한 다른 모든 상위 수준 객체에 대해default방법을 사용하는 방법을 보여 줍니다. -
프리미티브 실행을 위한 새로운 메서드가 추가되었습니다:
BaseSampler.run()과BaseEstimator.run(). 이러한 메서드는 비동기적으로 실행되며 예외에 대한 핸들을 제공하는JobV1객체를 반환합니다. 이러한 새로운 실행 메서드는QuantumCircuit객체(및BaseEstimator)를 전달할 수 있습니다. 예를 들어,estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result()이것은 이전 실행 모델(현재는 더 이상 사용되지 않음)에 대한 대안을 제공합니다
BaseSampler과BaseEstimator프리미티브가 생성자를 통해 모든 입력을 받고 해당 입력 매개변수의 조합으로 프리미티브 객체를 호출하여 실행에 사용할 수 있습니다. -
프리미티브의 참조 구현을 위한
shots옵션이 추가되었습니다. 난수는seed_primitive을 제공하여 수정할 수 있습니다. 예를 들어,from qiskit.primitives import Sampler from qiskit import QuantumCircuit bell = QuantumCircuit(2) bell.h(0) bell.cx(0, 1) bell.measure_all() with Sampler(circuits=[bell]) as sampler: result = sampler(circuits=[0], shots=1024, seed_primitive=15) print([q.binary_probabilities() for q in result.quasi_dists]) -
의 생성자와
BaseSampler과BaseEstimator프리미티브 클래스의 생성자에는 새로운 옵션 키워드 인수가 있는데,options이 인수는 노출된 옵션의 기본값을 설정하는 데 사용됩니다options어트리뷰트를 통해 노출되는 옵션의 기본값을 설정하는 데 사용됩니다. -
시간 진화 프레임워크에
PVQD클래스를 시간 진화 프레임워크에 추가했습니다qiskit.algorithms. 이 클래스는 예상 변동 양자 역학(p-VQD) 알고리즘인 Barison et al...각 타임스텝에서 이 알고리즘은 트로터 공식을 사용하여 다음 상태를 계산하고 이를 변형 양식에 투영합니다. 투영은 고전적인 최적화 루틴을 사용하여 트로터 진화 상태와 안사츠의 충실도를 최대화하여 결정됩니다.
import numpy as np from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.algorithms.evolvers import EvolutionProblem from qiskit.algorithms.time_evolvers.pvqd import PVQD from qiskit.primitives import Estimator, Sampler from qiskit import BasicAer from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.algorithms.optimizers import L_BFGS_B sampler = Sampler() fidelity = ComputeUncompute(sampler) estimator = Estimator() hamiltonian = 0.1 * SparsePauliOp([Pauli("ZZ"), Pauli("IX"), Pauli("XI")]) observable = Pauli("ZZ") ansatz = EfficientSU2(2, reps=1) initial_parameters = np.zeros(ansatz.num_parameters) time = 1 optimizer = L_BFGS_B() # setup the algorithm pvqd = PVQD( fidelity, ansatz, initial_parameters, estimator, num_timesteps=100, optimizer=optimizer, ) # specify the evolution problem problem = EvolutionProblem( hamiltonian, time, aux_operators=[hamiltonian, observable] ) # and evolve! result = pvqd.evolve(problem) -
이제
QNSPSA.get_fidelity()정적 메서드는 이제 선택적sampler인수를 지원합니다BaseSampler인터페이스(예Sampler,BackendSampler또는qiskit-ibm-runtime및qiskit-aer에 있는 것과 같은 공급자 구현)의 충실도를 계산하기 위해QuantumCircuit. 예를 들어,from qiskit.primitives import Sampler from qiskit.algorithms.optimizers import QNSPSA fidelity = QNSPSA.get_fidelity(my_circuit, Sampler()) -
위상 추정 클래스의 생성자에 새로운 키워드 인수
sampler를 추가했습니다:이 인수는 다음과 같은 인터페이스의 구현을 제공하는 데 사용됩니다
BaseSampler인터페이스의 구현을 제공하는 데 사용됩니다Sampler,BackendSampler와 같은 인터페이스 구현 또는qiskit-ibm-runtime및qiskit-aer과 같은 공급자 구현을 제공하는 데 사용됩니다.예를 들어,
from qiskit.primitives import Sampler from qiskit.algorithms.phase_estimators import HamiltonianPhaseEstimation from qiskit.synthesis import MatrixExponential from qiskit.quantum_info import SparsePauliOp from qiskit.opflow import PauliSumOp sampler = Sampler() num_evaluation_qubits = 6 phase_est = HamiltonianPhaseEstimation( num_evaluation_qubits=num_evaluation_qubits, sampler=sampler ) hamiltonian = PauliSumOp(SparsePauliOp.from_list([("X", 0.5), ("Y", 0.6), ("I", 0.7)])) result = phase_est.estimate( hamiltonian=hamiltonian, state_preparation=None, evolution=MatrixExponential(), bound=1.05, ) -
트랜스파일러 패스의
SabreSwap트랜스파일러 패스는 Rust에서 알고리즘을 재작성하여 런타임 성능이 크게 향상되었습니다. -
기호 펄스 서브클래스
Gaussian,GaussianSquare,Drag와Constant는 서브클래스 자체가 아닌SymbolicPulse를 인스턴스화하도록 업그레이드되었습니다. 서브클래싱이 더 이상 필요하지 않으므로 펄스 프로그램의 모든 파라메트릭 펄스 객체는 심볼릭 펄스 인스턴스여야 합니다.SymbolicPulse은SymbolicPulse.envelope에 정의된 기호 표현식 객체로 특정 봉투를 고유하게 식별할 수 있습니다. -
새로운 함수가 추가되었습니다,
sampled_expectation_value()를 추가하여 다음과 같은 분포에서 대각선 연산자의 기대값을 계산할 수 있습니다Counts와QuasiDistribution. 이 함수에 사용할 수 있는 유효한 연산자는 다음과 같습니다:str,Pauli,PauliOp,PauliSumOp및SparsePauliOp. -
A
SamplingVQE클래스가 도입되어 대각선 해밀턴에 최적화되고sampler프리미티브를 활용합니다. AQAOA클래스도 추가되어 하위 클래스SamplingVQE.예를 들어 참조 프리미티브와 함께 새로운
SamplingVQE을 사용하려면 다음과 같이 할 수 있습니다:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) sampler = Sampler() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalue평가된 보조 연산자는 이제 결과의
aux_operators_evaluated필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다.aux_operator_eigenvalues는 더 이상 유효한 필드가 아닙니다. -
메서드에 새로운
atol키워드 인수를 추가했습니다SparsePauliOp.equiv()메서드에 동등성 검사의 허용 오차를 조정하는 키워드 인수를 추가했습니다, -
트랜스파일러 스테이지를 위한 새로운 플러그인 인터페이스를 도입하여 특정 스테이지의 일부로 외부 패키지에서 대체 가능한
PassManager외부 패키지의 오브젝트를 특정 스테이지의 일부로 사용하거나transpile()또는StagedPassManager에서 출력generate_preset_pass_manager(),level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()및level_3_pass_manager(). 사용자는init_method,layout_method,routing_method,translation_method,optimization_method,scheduling_method키워드 인수를 사용하여 트랜스파일러 스테이지에 사용할 플러그인을 선택할 수 있습니다transpile()와generate_preset_pass_manager(). 현재 설치된 플러그인 이름의 전체 목록은list_stage_plugins()함수를 통해 확인할 수 있습니다. 플러그인을 만들려면 스테이지 플러그인 작성 가이드가 포함된qiskit.transpiler.preset_passmanagers.plugin모듈 문서에 스테이지 플러그인 작성 가이드가 포함되어 있습니다. -
에는
transpile()에는 각각init단계와optimization단계에 사용할 대체 플러그인을 지정하는 데 사용되는init_method및optimization_method이라는 두 개의 새로운 키워드 인수가 있습니다. -
클래스에는
PassManagerConfig클래스에는 생성자 메서드에 일치하는 키워드 인자와 함께init_method및optimization_method이라는 두 가지 새로운 어트리뷰트가 있습니다. 이는 사용자가 컴파일에 사용할init및optimization플러그인을 지정한 것을 나타냅니다. -
클래스가
SteppableOptimizer클래스가 추가됩니다. 메서드를 사용하여 기존 최적화를 단계별로 수행할 수 있습니다step()메서드를 사용합니다. 이러한 옵티마이저는 필요한 함수 또는 그라데이션 평가를 수동으로 계산하여 옵티마이저에 다시 연결할 수 있는 '묻고 답하기' 인터페이스를 구현합니다(선택 사항). 이 인터페이스에 대한 자세한 내용은 묻고 답하기 인터페이스를 참조하세요. 사용자가 단계별로 최적화를 수행하고자 하는 매우 간단한 사용 사례는 판독을 위한 것입니다:import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): return (np.linalg.norm(x) - 1) ** 2 def grad(x): return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) for _ in range(maxiter): state = optimizer.state # Here you can manually read out anything from the optimizer state. optimizer.step() result = optimizer.create_result()더 복잡한 경우는 오류 처리입니다. 평가 중인 함수가 무작위로 실패할 확률이 있다고 상상해 보세요. 이 경우 오류를 포착하고 원하는 결과가 나올 때까지 함수를 다시 실행한 후 최적화 프로세스를 계속할 수 있습니다. 이 경우 묻고 답하기 인터페이스를 사용합니다.
import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): if random.choice([True, False]): return None else: return (np.linalg.norm(x) - 1) ** 2 def grad(x): if random.choice([True, False]): return None else: return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) while optimizer.continue_condition(): ask_data = optimizer.ask() evaluated_gradient = None while evaluated_gradient is None: evaluated_gradient = grad(ask_data.x_center) optimizer.state.njev += 1 optmizer.state.nit += 1 cf = TellData(eval_jac=evaluated_gradient) optimizer.tell(ask_data=ask_data, tell_data=tell_data) result = optimizer.create_result()를
GradientDescent의 서브 클래스로 전환했습니다SteppableOptimizer. -
subset_fitter메서드가TensoredMeasFitter클래스에 추가됩니다. 구현은 각 큐비트가 개별적으로 완화되는 완화 패턴으로 제한됩니다(예:[[0], [1], [2]]). 그러나 이것이 가장 널리 사용되는 경우입니다. 이는TensoredMeasFitter를 물리적 큐비트의 숫자 순서가 기존 비트의 인덱스와 일치하지 않는 경우에 사용할 수 있습니다. -
이제 트랜스파일러를 통해 최적화 레벨 0과 1에서 제어 흐름 연산이 지원됩니다(예
transpile()또는generate_preset_pass_manager()키워드 인자로optimization_level=1). 이제 다음과 같은 회로를 구성할 수 있습니다from qiskit import QuantumCircuit qc = QuantumCircuit(2, 1) qc.h(0) qc.measure(0, 0) with qc.if_test((0, True)) as else_: qc.x(1) with else_: qc.y(1)등을 통해 성공적으로 트랜스파일할 수 있습니다:
from qiskit import transpile from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") transpiled = transpile(qc, backend)키워드 인수
layout_method에 사용할 수 있는 값은 "trivial" 및 "dense"입니다.routing_method의 경우 "확률적" 및 "없음"을 사용할 수 있습니다. 번역(translation_method)은 '번역기' 또는 '언롤러'를 사용하여 수행할 수 있습니다. 최적화 레벨 2와 3은 아직 제어 흐름과 회로 스케줄링(scheduling_method)에 값을 제공하는 것과 같이 지원되지 않지만, 키스킷 테라의 후속 릴리스에서 이들과 다른 레이아웃, 라우팅 및 변환 방법에 대한 지원을 확대할 계획입니다.백엔드에서 제어 흐름 연산을 사용한 번역이 성공하려면 백엔드에 명시된 기반에 필요한 제어 흐름 연산이 있어야 합니다. 예를 들어, 키스킷 에어가 이를 수행합니다. 단순히 이러한 번역을 시도해보고 싶다면
basis_gates인수를 재정의하여transpile(). -
다음 트랜스파일러 패스는 모두 다음과 같은 형태로 제어 흐름 구조를 이해하도록 학습되었습니다
ControlFlowOp명령어의 형태로 제어 흐름 구조를 이해하도록 학습되었습니다:레이아웃 관련
ApplyLayoutDenseLayoutEnlargeWithAncillaFullAncillaAllocationSetLayoutTrivialLayoutVF2LayoutVF2PostLayout
라우팅 관련
번역 관련
BasisTranslatorContainsInstructionGatesInBasisUnitarySynthesisUnroll3qOrMoreUnrollCustomDefinitionsUnroller
최적화와 관련된
BarrierBeforeFinalMeasurementsDepthFixedPointSizeOptimize1qGatesDecompositionCXCancellationRemoveResetInZeroState
이러한 패스는 가장 일반적으로 사전 설정된 패스 관리자(
transpile()및generate_preset_pass_manager())를 통해 사용되지만 다른 용도로도 사용할 수 있습니다. 이제 이러한 패스는 적절한 경우 제어 흐름 작업으로 재귀하여 내부 블록을 업데이트하거나 분석합니다. -
새로운
TrotterQRTE클래스를 구현하는RealTimeEvolver인터페이스를 구현하는 새로운 클래스를 추가했습니다qiskit.primitives.BaseEstimator를 사용하여 계산을 수행하는 인터페이스를 구현하는 새로운 클래스를 추가했습니다. 이 새로운 클래스는 이전에 사용 가능했던qiskit.algorithms.TrotterQRTE클래스(향후 릴리스에서 더 이상 사용되지 않고 제거될 예정)를 대체합니다Backend또는QuantumInstance을 사용하여 계산을 수행했습니다. -
DAGCircuit.substitute_node_with_dag()이제propagate_condition을 키워드 인수로 사용합니다. 기본값은 이전 동작인True이며, 대체할 노드의 모든 조건을 대체의 모든 작업 노드에 복사합니다.False로 설정하면 조건이 복사되지 않으므로 조건 노드를 이미 조건을 충실히 구현하는 하위 DAG로 대체할 수 있습니다. -
DAGCircuit.substitute_node_with_dag()는 이제 시퀀스뿐만 아니라wires매개변수에 대한 매핑도 사용할 수 있습니다. 매핑은 대체 DAG의 비트를 삽입되는 DAG의 비트에 매핑해야 합니다. 이렇게 하면 입력 노드에 기존 비트와 조건이 모두 있는 경우 호출자가 더 쉬운 스타일의 구성을 할 수 있으며, 대체 DAG는 이러한 순서를 벗어난 비트를 사용할 수 있습니다. -
패키지를 추가하여
qiskit.algorithms.minimum_eigensolvers패키지에 프리미티브 지원 알고리즘을 위한 인터페이스를 추가했습니다.VQE이 구현에서는 프리미티브를 활용하기 위해 리팩터링되었습니다.예를 들어 참조 프리미티브와 함께 새 구현을 사용하려면 다음과 같이 할 수 있습니다:
from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp h2_op = SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], ) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() vqe = VQE(estimator, ansatz, optimizer) result = vqe.compute_minimum_eigenvalue(h2_op) eigenvalue = result.eigenvalue평가된 보조 연산자는 이제 결과의
aux_operators_evaluated필드를 통해 확인할 수 있습니다. 이는 이러한 연산자에 대한 기대값과 프리미티브 실행의 메타데이터가 포함된 튜플의 목록 또는 딕셔너리로 구성됩니다.aux_operator_eigenvalues는 더 이상 유효한 필드가 아닙니다.
업그레이드 주의사항
-
의 경우
Target객체의 경우 연결 제약 조건 없이 전역으로 정의된 2 큐비트 연산만 포함된 객체의 경우Target.build_coupling_map()메서드의 반환은 이제None대신CouplingMap객체가 아닌num_qubits노드를 포함하고 에지가 없는 객체로 반환됩니다. 이 변경은 실제 연결 제약 조건을 더 잘 반영하기 위해 이루어졌습니다Target이 경우 모델링되는 백엔드에는 연결성 제약 조건이 없으므로Target에 의해 모델링되는 백엔드에 연결 제약이 없기 때문입니다. 어떤 이유로든 이전 동작을 원한다면None반환을 확인하고 수동으로 커플링 맵을 작성하여 이전 동작을 재현할 수 있습니다:from qiskit.transpiler import Target, CouplingMap from qiskit.circuit.library import CXGate target = Target(num_qubits=3) target.add_instruction(CXGate()) cmap = target.build_coupling_map() if cmap is None: cmap = CouplingMap() for i in range(target.num_qubits): cmap.add_physical_qubit(i) -
의 생성자에서
entanglement키워드 인수의 기본값은RealAmplitudes및EfficientSU2클래스의 생성자 인수 기본값이"full"에서"reverse_linear"으로 변경되었습니다. 이 변경은 출력 회로는 동일하지만 대신CXGate게이트만 사용합니다. 이전 기본값을 사용하려면 생성자를 호출할 때entanglement="full"을 명시적으로 설정하면 됩니다. -
에 유효성 검사 추가
BaseSampler.run(). 클래식 비트가 없는 경우 오류가 발생합니다. -
펄스 빌더 기능의 동작
call()펄스 빌더 기능이 업그레이드되었습니다. 인스턴스가 이 메서드에 의해 호출되면ScheduleBlock인스턴스가 이 메서드에 의해 호출되면, 내부적으로 현재 컨텍스트에Reference를 생성하고 호출된 프로그램을 즉시 참조에 할당합니다. 따라서Call명령어가 더 이상 생성되지 않습니다. 이 변경 사항과 함께 동일한name인수를 사용하여 다른 블록을 호출하는 것이 금지됩니다. 이러한 작업은 오류가 발생합니다. -
다음 키스킷 테라 릴리스( 0.23 )부터는 대부분의 아키텍처에서
tweedledum패키지가 필수 항목이 아닌 선택적 종속 요소가 됩니다. 현재 일부 고전적인 위상 오라클 함수에서 사용됩니다. 애플리케이션이나 라이브러리에 이 기능이 필요한 경우 패키지의 종속성에tweedledum을 추가하여 즉시 준비할 수 있습니다.tweedledum는 키스킷 테라 0.22 에서 즉시 적용되며 macOS arm64 ( M1 )에서 더 이상 요구 사항이 아닙니다. 이 플랫폼에 제공된 바퀴가 고장 났고 대부분의 사람들이 SDIST에서 빌드하는 것은 신뢰할 수 없기 때문입니다.tweedledum의 작동 버전을 수동으로 설치하면 모든 종속 기능이 계속 작동합니다. -
객체의
._layout속성이QuantumCircuit객체를 저장하는 것에서Layoutinitial_layout객체를 저장하는 것에서 2개의 속성을 가진 데이터 클래스를 저장하는 것으로 변경되었습니다Layout객체와 원래 회로의 위치 인덱스에 큐비트를 매핑하는 사전을 포함하는input_qubit_mapping객체의 두 가지 속성으로 저장됩니다. 이 변경은 트랜스파일 후 회로가 모든 상황에서 초기 레이아웃으로 인한 순열을 완전히 되돌릴 수 있도록 모든 정보를 제공하기 위해 필요했습니다. 이 속성은 비공개이며 외부에서 사용해서는 안 되지만, 초기 레이아웃을 추적할 수 있는 유일한 방법이기 때문에transpile()을 통해 초기 레이아웃을 추적할 수 있는 유일한 방법이므로 변경 사항을 문서화합니다. 키스킷 API에서 해결되지 않는_layout속성에 대한 사용 사례가 있는 경우, 이 기능 공백을 해결할 수 있도록 이슈를 열어주세요. -
의 생성자는
SetPhase,ShiftPhase,SetFrequency및ShiftFrequency클래스의 생성자는 이제PulseError를 발생시킵니다.channel인수를 통해 전달된 값이PulseChannel의 인스턴스가 아닌 경우. 이 변경은 생성자에 대한 입력이 펄스 채널에만 유효하고 다른 유형의 채널에는 유효하지 않기 때문에 생성자에 대한 입력이 유효한지 확인하기 위해 이루어졌습니다. -
함수는
plot_histogram()함수는 이산 구간차원 값의 실제 히스토그램을 반환하도록 수정되었습니다. 함수의 이전 동작은 이름과 달리 실제로는 입력 분포의 시각화를 생성하는 것이었습니다. 함수 이름과 동작 사이의 이러한 불일치로 인해 함수 동작이 변경되어 이제 실제로 적절한 불연속형 데이터 히스토그램을 생성하고 있습니다. 카운트 데이터의 확률 분포를 그리는 이전 동작을 유지하려는 경우에는plot_distribution()를 사용하여 동등한 그래프를 생성할 수 있습니다. 예를 들어 이전 동작(plot_histogram({'00': 512, '11': 500}))은 다음과 같이 다시 만들 수 있습니다:from qiskit.visualization import plot_distribution import matplotlib.pyplot as plt ax = plt.subplot() plot_distribution({'00': 512, '11': 500}, ax=ax) ax.set_ylabel('Probabilities') -
qiskit.pulse.builder컨텍스트inline및pad가 제거되었습니다. 이 기능은 테라 0.18.0 (2021년 7월)에서 처음 사용 중단되었습니다.inline을 대체할 수 있는 방법은 없으며, 포함된 범위에서 펄스를 작성하기만 하면 됩니다.pad컨텍스트 관리자는 더 이상 사용되지 않으므로 효과가 없습니다. -
트랜스파일러 패스의 출력은
SabreSwap트랜스파일러 패스(optimization_level=3또는routing_method또는layout_method을 호출할 때'sabre'으로 설정된 경우 포함transpile())의 출력(시드 값이 고정된 경우 포함)은 이전 릴리스에서 변경될 수 있습니다. 이는 새로운 난수 생성기가 Rust에서 패스를 다시 작성하는 과정에서SabreSwap패스를 재작성하여 성능을 크게 개선했기 때문입니다. 일관된 출력에 의존하는 경우 이전 버전의 키스킷에서 패스를 실행하고qiskit.qpy를 사용하여 회로를 저장한 다음 현재 버전을 사용하여 로드할 수 있습니다. -
이전 릴리스에서
Layout.add()physical_bit를 지정하지 않을 때의 동작이 이전 릴리스에서 변경되었습니다. 이전 릴리스에서는 객체의 길이에 따라 새로운 물리적 비트가 추가되었습니다Layout객체의 길이에 따라 새로운 물리적 비트가 추가되었습니다. 예를 들어Layout에 물리적 비트 1과 3을 연속적으로 호출하면add()를 호출하면 물리적 비트 2, 4, 5, 6 등이 추가됩니다. 실제 비트가 2와 3이면 연속적으로 호출하면 4, 5, 6, 7 등이 추가됩니다. 대신Layout.add()는 먼저 0과 최대 물리 비트 사이에 누락된 물리 비트를 추가합니다Layout. 따라서 1과 3 예제의 경우 이제 0, 2, 4, 5를 추가하고 2와 3 예제의 경우 0, 1, 4, 5를 추가합니다Layout. 이 변경은 결과의 예측 가능성을 높이고 예기치 않은 동작으로 인해 발생하는 여러 종류의 버그를 수정하기 위해 이루어졌습니다. 백엔드의 물리적 비트는 항상 0에서 까지 연속된 시퀀스이므로 아직 사용하지 않은 물리적 비트가 있을 때 새 비트를 추가하면 레이아웃이 백엔드에서 사용할 수 있는 것보다 더 많은 비트를 사용하게 될 가능성이 있습니다. 이전 동작을 원한다면, 호출할 때 원하는 물리적 비트를 수동으로 지정할 수 있습니다Layout.add(). -
더 이상 사용되지 않는 메서드
SparsePauliOp.table속성이 제거되었습니다. 이 기능은 원래 키스킷 테라 0.19 에서 더 이상 사용되지 않습니다. 대신paulis()방법을 사용해야 합니다. -
함수에서
PauliTable반환에 대한 지원이pauli_basis()함수에 대한 지원이 제거되었습니다. 마찬가지로,pauli_list인수는pauli_basis()함수(현재 유일한 반환 유형)로 전환하는 데 사용되었던PauliList(현재 유일한 반환 유형)로 전환하는 데 사용되었던 인수가 제거되었습니다. 이 기능은 키스킷 테라 0.19 릴리스에서 더 이상 사용되지 않습니다. -
가짜 백엔드 객체
FakeJohannesburg,FakeJohannesburgV2,FakeAlmaden,FakeAlmadenV2,FakeSingapore및FakeSingaporeV2는 더 이상 펄스 기본 페이로드를 포함하지 않습니다. 이는BackendV1기반 클래스의 경우BackendV1.defaults()메서드 및 펄스 시뮬레이션을 통한BackendV1.run()을 통한 펄스 시뮬레이션을 더 이상 사용할 수 없습니다. ForBackendV2기반 클래스의 경우calibration속성의 지침에 대한Target가 더 이상 채워지지 않습니다. 이 변경은 이러한 시스템이 파라미터 펄스 정의 대신 샘플링된 파형을 사용하기 때문에 펄스 기본 페이로드(총 ~50MB )가 지나치게 크기 때문에 이루어졌습니다. 이 세 개의 페이로드 파일은 qiskit-terra를 설치하는 데 필요한 디스크 공간의 50% 이상을 차지합니다. 펄스 인식 또는 펄스 시뮬레이션으로 컴파일할 수 있는 잠재적 가치와 이러한 폐기된 디바이스의 파일 크기를 비교했을 때 파일 크기는 비용 대비 가치가 없습니다. 이러한 속성을 활용해야 하는 경우, 이전 버전의 키스킷을 활용하고qpy를 사용하여 이전 버전의 키스킷에서 현재 릴리스로 회로를 전송할 수 있습니다. -
isinstance펄스 클래스로 확인Gaussian,GaussianSquare,Drag및Constant는 이러한 펄스 하위 클래스가 더 이상 인스턴스화되지 않으므로 무효화됩니다. 테라 0.22 에서 계속 작동하지만 즉시 전환을 시작해야 합니다. 유형 정보를 사용하는 대신SymbolicPulse.pulse_type을 사용해야 합니다. 이것은 펄스 봉투에 대한 고유한 문자열 식별자로 가정하고 문자열 동일성을 사용하여 펄스 유형을 조사할 수 있습니다. 예를 들면 다음과 같습니다.from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if isinstance(pulse, Gaussian): print("This is Gaussian pulse.")이 코드는 다음과 같이 업그레이드해야 합니다
from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if pulse.pulse_type == "Gaussian": print("This is Gaussian pulse.")같은 이유로 펄스 유형 정보를 얻기 위해
pulse.__class__.__name__같은 클래스 속성에 액세스해서는 안 됩니다. -
예외
qiskit.exceptions.QiskitIndexError는 qiskit-terra 0.18.0 (2021년 7월 12일에 릴리스됨)의 사용 중단 공지에 따라 제거되었으며 더 이상 존재하지 않습니다. -
더 이상 사용되지 않는 인자
epsilon및factr이 제거되었습니다L_BFGS_B옵티마이저 클래스의 생성자 인수가 제거되었습니다. 이러한 인수는 원래 0.18.0 릴리스(2021년 7월 12일 출시)의 일부로 더 이상 사용되지 않습니다. 대신ftol인수를 사용해야 하며, 이러한 인수 간의 관계에 대한 자세한 내용은 옵티마이저의 scipy 문서를 참조하세요. -
레벨 1과 2에 대한 사전 설정된 패스 관리자는
optimization_level=1또는optimization_level=2에서transpile()또는generate_preset_pass_manager()및 출력level_1_pass_manager()및level_2_pass_manager()는 이제 이전 기본값 대신SabreLayout와SabreSwap가 이전의 기본값인DenseLayout및StochasticSwap. 이 변경은 트랜스파일러의 출력 품질을 개선하기 위해 이루어졌습니다SabreLayout와SabreSwap조합을 사용하면 일반적으로 출력 회로에 삽입되는SwapGate객체가 출력 회로에 삽입되는 횟수가 줄어듭니다. 이전 기본 패스를 사용하려면layout_method='dense'및routing_method='stochastic'을 설정하면 됩니다transpile()또는generate_preset_pass_manager()를 설정하여DenseLayout및StochasticSwap로 설정하면 됩니다. -
함수에서 기본적으로
approximation_degree!=1.0의 암시적 사용은transpile()optimization_level=3함수의 암시적 사용이 비활성화되었습니다. 트랜스파일러는 기본적으로 일면 순열 및 유사도 변환과 같은 알려진 변환까지 입력의 균일성을 유지해야 합니다. 이전에는approximation_degree=None을 사용하면 트로터화 진화와 같이 시간 단계가 많은 경우 단위가 과도하게 근사화되어 잘못된 결과를 초래하는 경우 잘못된 결과를 초래할 수 있었습니다. 단일 동등성을 깨는 변환은 사용자가 명시적으로 활성화해야 한다는 결정이 내려졌습니다. 합성된UnitaryGate명령어가 대상 백엔드의 기본 명령어의 오류율까지 근사화되는 이전의 기본 동작을 원한다면,approximation_degree=None을 호출할 때 명시적으로 설정할 수 있습니다transpile()를optimization_level=3로 대체할 수 있습니다:transpile(circuit, backend, approximation_degree=None, optimization_level=3) -
에서 허용되는 최대 함수 평가 횟수(
maxfun)의 기본값을 1000에서 2000으로 변경합니다L_BFGS_B의 기본값( SciPy )과 일치하도록 1000에서 15000으로 변경합니다. 이 숫자는 기본 반복 횟수(maxiter)와도 일치합니다. -
업데이트
ProbDistribution및QuasiDistribution를 사용하여 접두사 “0b” 없는 비트 문자열이 주어지면 비트 수에 대한 정보를 저장합니다.ProbDistribution.binary_probabilities()및QuasiDistribution.binary_probabilities()는 저장된 비트 수를 비트 수의 기본값으로 사용합니다. -
RZXCalibrationBuilder및RZXCalibrationBuilderNoEcho는 예기치 않은 오류로 패스가 종료되는 것을 방지하기 위해 비반향 교차 공명(ECR) 시퀀스로 구현된 스트레칭 CX 게이트를 건너뛰도록 업그레이드되었습니다. 이 패스는 새로운 인수verbose를 사용하여 이러한 상황이 발생했을 때 패스가 경고할지 여부를 제어합니다.verbose=True을 설정하면 패스가 비ECR 시퀀스를 발견할 때 사용자 경고를 표시합니다. -
시각화 모듈
qiskit.visualization이 내부적으로 개편되었습니다. 공개 인터페이스에는 영향을 미치지 않아야 하지만 회로 서랍의 내부에 액세스하는 경우 이제 다른 위치에 있을 수 있습니다. 시각화 모듈에서 공개로 간주되는 부분은 이 온라인 설명서에 문서화된 구성 요소뿐입니다.
지원 중단 노트
-
에서 직접
Int1,Int2,classical_function및BooleanExpression이름을 가져오는 것은qiskit.circuit는 더 이상 사용되지 않습니다. 이는tweedledum을 필수 종속 항목이 아닌 선택 종속 항목으로 만들기 위한 조치의 일환입니다. 대신 다음에서 이러한 이름을 가져와야 합니다qiskit.circuit.classicalfunction. -
qiskit.algorithms.factorizers및qiskit.algorithms.linear_solvers모듈은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 키스킷 교재의 튜토리얼로 대체됩니다: 쇼어 HHL -
random_stabilizer_table()은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 대신random_pauli_list()함수를 사용해야 합니다. -
펄스 모듈 기능(
qiskit.pulse.utils.deprecated_functionality)은 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이는 주로 내부 전용 기능이었습니다.qiskit.utils.deprecate_function에서 동일한 기능을 제공하므로 대신 사용해야 합니다. -
프리미티브 실행 방법이 변경되었습니다.
BaseSampler.__call__()및BaseEstimator.__call__()메서드는 더 이상 사용되지 않습니다. 예를 들어,estimator = Estimator(...) result = estimator(circuits, observables, parameters) sampler = Sampler(...) result = sampler(circuits, observables, parameters)를 다음과 같이 다시 작성해야 합니다
estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result() sampler = Sampler() result = sampler.run(circuits, parameter_values).result()프리미티브를 컨텍스트 관리자로 사용하는 것은 더 이상 사용되지 않습니다. 모든 프리미티브에 컨텍스트 관리자가 있는 것은 아닙니다. 사용 가능한 경우(예:
qiskit-ibm-runtime)에는 세션의 컨텍스트 관리자가 동일한 기능을 제공합니다.circuits,observables,parameters을 생성자에서 더 이상 사용되지 않습니다.circuits및observables메서드에서run메서드를 전달할 수 있습니다.run메서드는parameters을 지원하지 않습니다. 사용자가 직접 매개변수 값을 조정해야 합니다. -
의 미사용 인수
qubit_channel_mappingRZXCalibrationBuilder및RZXCalibrationBuilderNoEcho트랜스파일러 패스는 더 이상 사용되지 않으며 향후 릴리스에서 제거될 예정입니다. 이 인수는 더 이상 사용되지 않으며 패스 작동에 영향을 미치지 않습니다.
버그 수정
-
다음과 같은 문제가 수정되었습니다
Pauli.evolve()와PauliList.evolve()가 폴리의 위상을 수정하는 특정 클리포드 게이트로 진화할 때 dtype 오류가 발생하던 문제를 수정했습니다. 수정 #8438 -
의 버그를 수정했습니다
QuantumCircuit.initialize()및QuantumCircuit.prepare_state()의 버그를 수정하여 초기화 인자로Qubit를 하나도 받지 못하도록 했습니다. -
메서드
QuantumCircuit.while_loop()는 이제 그 조건에서 고전적인 비트 참조를QuantumCircuit.if_test()와InstructionSet.c_if()와 같은 방식으로 해결합니다. -
메서드의
DAGCircuit메서드depth(),size()와DAGCircuit.count_ops()메서드는 이전에는 제어 흐름이 회로에 존재할 경우 의미가 거의 없거나 전혀 없는 결과를 조용히 반환했습니다. 그리고depth()와size()메서드는 이제 이러한 경우 오류를 올바르게 발생시키지만 새로운recurse키워드 인수를 사용하여 프록시 값을 계산할 수 있고count_ops()는 기본적으로 블록으로 재귀하여 그 안의 연산을 계산합니다. -
트랜스파일러 패스의 문제를 수정했습니다
DenseLayout트랜스파일러 패스에서 느슨한Qubit오브젝트(즉, 하나의QuantumRegister의 일부가 아닌QuantumCircuit에 포함되지 않은 오브젝트(예Layout에 포함되지 않던 문제를 수정했습니다. -
생성자 메서드의
Operator.from_circuit()의 레이아웃 출력을 처리할 수 있도록 생성자 메서드가 업데이트되었습니다transpile()의 레이아웃 출력을 처리하고 모든 경우에 레이아웃으로 인한 큐비트 순열을 올바르게 반전시킬 수 있도록 업데이트되었습니다. 이전에는 트랜스파일된 회로가 느슨한 객체를 사용했다면Qubit객체, 여러QuantumRegister객체 또는 이름이 다른 단일QuantumRegister"q"을 사용했다면 생성자가 회로에서Operator를 생성하지 못했습니다. 수정 #8800. -
하나의 큐비트와 하나의 양자 게이트가 포함된 클래식 비트로 인스트럭션을 분해할 때 실패하던 버그가 수정되었습니다. 이제 다음은 예상대로 분해됩니다:
block = QuantumCircuit(1, 1) block.h(0) circuit = QuantumCircuit(1, 1) circuit.append(block, [0], [0]) decomposed = circuit.decompose() -
에서 빈 심플렉티브 행렬의 초기화 수정
from_symplectic()에서PauliList클래스 예를 들어:from qiskit.quantum_info.operators import PauliList x = np.array([], dtype=bool).reshape((1,0)) z = np.array([], dtype=bool).reshape((1,0)) pauli_list = PauliList.from_symplectic(x, z) -
트랜스파일러 패스의 문제 수정
GateDirection트랜스파일러 패스의CZGate. CZ 게이트는 대칭이므로 큐비트 인수를 뒤집어 방향성 커플링 맵과 일치시킬 수 있습니다. -
호출과 중첩된 매개변수 바인딩 사이에 회로 샘플러를 재사용할 때
DerivativeBase.gradient_wrapper()메서드의 문제를 수정했습니다. -
mpl및latex회로 서랍에서 회로에barrier이 있을 때idle_wires옵션을 False로 설정하면 서랍이 작동하지 않던 문제가 수정되었습니다. 수정 #8313 -
의 문제를 수정했습니다
circuit_drawer()및QuantumCircuit.draw()latex에서 임시 디렉터리 (예:/tmp)가 작업 디렉터리와 다른 파일 시스템에 있는 시스템에서OSError이 발생하는 문제를 수정했습니다. 수정 #8542 -
중첩
FlowController를 다른PassManager에 중첩하면 이전에는 일부 트랜스파일러 패스가 트랜스파일링 중에 "잊혀지는" 경우가 있었는데, 패스가 입력을 변경하는 대신 새로운DAGCircuit를 반환하는 경우 일부 트랜스파일러 패스가 "잊혀지는" 문제가 있었습니다. 중첩FlowController가 이제 올바르게 번역에 영향을 미칩니다. -
비교하다
QuantumCircuit그리고DAGCircuit이전에는 회로에 동일한 유형의 레지스터가 두 개 이상 포함된 경우( 예: 두 개 이상) s가 동등성에 대한 비결정적이었습니다.QuantumRegisters), 때때로 돌아오다False레지스터가 동일하더라도. 이제 여러 레지스터가 있는 회로를 올바르게 비교합니다. -
OpenQASM 2 익스포터(
QuantumCircuit.qasm())는 이제 모든 큐비트에 영향을 주지 않는 연산에 대해UnitaryGate연산에 대한 큐비트 매개변수를 올바르게 정의합니다. 8224번 수정. -
text회로 서랍에 두 가지 버그가 수정되었습니다.vertical_compression을 기본값인medium으로 설정했을 때 이러한 현상이 나타납니다. 첫 번째는 텍스트가 다른 텍스트나 게이트를 덮어쓰는 경우가 있고, 두 번째는 게이트와 컨트롤 사이의 연결이 끊어지는 경우가 있습니다. 8588번을 참조하세요. -
1 큐비트 게이트가 있는 회로의
UnitarySynthesis게이트가 1 큐비트인 회로와 aTarget입력이 있는 회로가 예상대로 처리되지 않고 때때로 실패하는 문제를 수정했습니다. -
트랜스파일러 패스의
GateDirection트랜스파일러 패스는 이제 파라미터화된 게이트를 처리할 때 게이트 파라미터에 사용 가능한 값을 존중합니다Target. -
옵티마이저 클래스의 문제를 수정했습니다
SNOBFIT옵티마이저 클래스의 문제를 수정했습니다minimize()메서드 실행 중 내부 오류가 발생하는 문제를 수정했습니다. 이제 호출 시 이를 확인하여 필요한 바운드가 호출에 누락된 경우 신속하게ValueErrorminimize()호출합니다. 수정 #8580 -
메서드에서 호출 가능한 출력의 문제를 수정했습니다
get_energy_evaluation()메서드에서 호출 가능한 출력 문제를 수정했습니다VQD클래스가 이제 실행될 때 지정된callback을 올바르게 호출합니다. 이전에는 이 경우 콜백이 잘못 사용되지 않았습니다. 수정 #8575 -
클래식 비트가 없는 회로에서
reverse_bits=True과 함께circuit_drawer()을 사용할 때cregbundle에 대한 잠재적으로 혼란스러운 경고가 표시되는 문제를 수정했습니다. 수정 #8690 -
OpenQASM 3 익스포터(
qiskit.qasm3)는 이제 고전적인 조건이 적용된 OpenQASM 내장(예:reset및measure)을 올바르게 처리합니다c_if(). 이전에는 이 조건이 무시되었을 것입니다. -
클래스 관련 문제를 수정했습니다
SPSA클래스에서 내부적으로 균일한 크기의 배치로 작업을 일괄 처리하려고 할 때 균일한 배치를 생성할 수 없는 경우 예외가 발생하는 문제를 수정했습니다. 이 문제가 수정되어 크기가 균등하지 않은 작업도 항상 성공적으로 일괄 처리됩니다. -
의 동작을 수정했습니다
Layout.add()의 출력이 잠재적으로transpile()의 출력이 유효하지 않고 대상 백엔드에서 사용 가능한 것보다 더 많은 큐비트를 포함할 수 있는 동작을 수정했습니다. 수정되었습니다: #8667 -
state_to_latex()함수의 문제를 수정했습니다. 함수의 선택적 인수prefix에 라텍스 문자열을 전달하면 오류가 발생했습니다. 수정 #8460 -
state_to_latex()함수는 0에 가까운 값이 있을 때 유효하지 않은 LaTeX 값을 생성하여state_drawer()호출 시 오류가 발생했습니다. 수정 #8169. -
GradientDescent는 이제 반복 횟수, 함수 평가 및 그라데이션 평가 횟수를 올바르게 계산합니다. 또한 이제 문서에 그라데이션이 순방향 유한 차분 방법으로 근사화된다는 내용이 올바르게 명시되어 있습니다. -
의 사용 중단 경고를 수정했습니다
NaturalGradient에서normalize매개 변수가True로 설정된 경우 이제StandardScaler를 사용하여 모델을 맞추기 전에 데이터의 크기를 조정합니다.
에어 0.11.0
변경 없음
IBM Q 제공자 0.19.2
변경 없음