키스킷 1.0 릴리즈 노트
1.0.2
Prelude
키스킷 1.0.2 은 1.0 시리즈의 사소한 버그 수정 릴리스입니다.
버그 수정
-
다음과 관련된 문제를 수정했습니다
convert_to_target()에서 제어 흐름 명령이 제어 흐름 명령이 객체에서 지정되는 일반적인 위치인BackendConfiguration.supported_instructions속성에 지정된 경우 변환기가 제어 흐름 명령을 잘못 무시하는 문제를 수정했습니다BackendConfiguration객체에 지정되는 일반적인 위치입니다. 11872 수정. -
호출
EquivalenceLibrary.set_entry()을 호출하면 이제 라이브러리의 내부 그래프 객체가 올바르게 업데이트됩니다. 이전에는 메타데이터는 업데이트되지만 그래프 구조는 변경되지 않았기 때문에 다음과 같은 사용자는BasisTranslator와 같은 사용자는 여전히 이전 규칙을 사용하게 됩니다. 고정 #11958. -
이제
EvolvedOperatorAnsatz는 이제operators인수가 빈 목록인 경우를 올바르게 처리합니다. 이전에는 이렇게 하면 오류가 발생했습니다. -
0 큐비트 인스턴스의 일관성 문제 수정
EvolvedOperatorAnsatz인스턴스의 일관성 문제를 수정했습니다. 이전에는 이러한 인스턴스에는 단일QuantumRegisterinqregs를 포함했지만 이제는 레지스터가 생성되지 않습니다. 이 동작은 슈퍼클래스와 더 일관되게 일치합니다QuantumCircuit. -
의 충돌을 수정했습니다
convert_to_target()에서 쿼비트 속성( T1, T2 또는 주파수)이 누락되었을 때 발생하는 충돌을 수정했습니다. 에서 누락된 속성 값이QubitProperties의 누락된 속성 값은 이제None으로 채워집니다. -
회로에서 많은 수의 큐비트와 비트를 역직렬화할 때
qpy.load()함수의 성능 문제를 수정했습니다. 회로에 많은 수의 큐비트 또는 클릿이 있는 QPY 페이로드를 역직렬화할 때. -
EstimatorPub.coerce()및SamplerPub.coerce()이BindingsArray유형의 매개 변수를 부적절하게 처리하는 버그를 수정했습니다. 이전에는ValueError예외가 잘못 발생했습니다. -
에서 사용하는 사전 설정 패스 관리자
transpile()가 사용하는 사전 설정 패스 관리자는 더 이상 하드웨어 타겟이나 기본 게이트 세트가 지정되지 않은 제어 흐름이 있는 회로에서 실패하지 않습니다. 이제 이러한 추상적인 대상을 모든 제어 흐름 작업을 허용하는 것으로 취급합니다. 11906 수정. -
입력이 중첩되지 않은 단일 옵저버블인 경우 0-d 배열을 반환하도록
coerce()을 수정했습니다. 이전에는 모양이(1,)인 단일 차원으로 잘못 업그레이드되었습니다. -
Parameter는 동일하게 비교되는 인스턴스가 항상 동일한 해시를 갖도록 업데이트되었습니다. 이전에는Parameter.uuid만 비교되었기 때문에Parameteruuid매개변수의 공통 값(일반적으로 명시적으로 전달되지 않음)을 사용하여 생성된 경우 이름이 다른 인스턴스도 동일하게 비교될 수 있었습니다. -
버그 수정
QuantumCircuit.draw()의 버그가 수정되어 Matplotlib 서랍의 사용자 정의 스타일 사전이 실행 시 수정되었습니다.
1.0.1
Prelude
키스킷 1.0.1 은 키스킷 1.0.0 릴리스에서 확인된 소수의 버그를 수정하는 패치 릴리스입니다.
버그 수정
-
사용자 지정 펄스 지침을 레거시 형식으로 변환하는 버그가 수정되었습니다
qiskit.qobj형식으로 변환하는 버그를 수정했습니다. 이 버그는 키스킷( 1.0.0 )에 도입되어 사용자 지정 펄스 모양을 가진 명령어를 변환할 때 오류가 발생했습니다. 수정 후 변환이 올바르게 수행되고 사용자 지정 펄스가 정상적으로pulse.Waveform로 변환됩니다. 11828 수정. -
트랜스파일러 패스의 문제를 수정했습니다
InverseCancellation트랜스파일러 패스에서 경우에 따라 파라미터 값이 일치하지 않더라도 자체 역 파라미터화된 게이트가 잘못 취소되는 문제를 수정했습니다. 11815 수정. -
BasePassManager.run()은 더 이상 이전 워크플로우를PropertySet을 두 번 이상 호출할 때 새 워크플로로 누출되지 않습니다. 이전에는 이전과 동일한PropertySet을 사용하여 후속 실행을 초기화했는데, 이는 잘못된 속성 정보가 작업에 제공되고 있음을 의미할 수 있습니다. 이제 동작은 Qiskit 0.44 의 동작과 일치합니다. 수정 #11784. -
convert_durations_to_dt()에서 함수가 실제 단위를 읽지 않고 입력값을 모두 초 단위로 가정하는 버그가 수정되었습니다. 이로 인해 보고된 회로 지속 시간이 잘못 계산될 수 있습니다.
1.0.0
Prelude
키스킷을 출시하게 되어 매우 기쁘게 생각합니다 1.0.0. 이번 릴리스는 키스킷을 안정적이고 고성능의 양자 컴퓨팅용 SDK로 성숙시키기 위한 7년간의 개발의 정점이며, 키스킷 프로젝트와 커뮤니티의 새로운 시대를 여는 시작입니다. 일반적인 성능 및 안정성 개선 외에도 1.0.0 릴리스에서 가장 중요한 변경 사항은 안정성 정책, 릴리스 주기 및 버전 관리와 관련이 있습니다. 키스킷은 이제 시맨틱 버전 관리를 공식적으로 사용하고 있으며, 이는 1.x 릴리스 시리즈의 전체 수명 주기 동안 프로젝트가 공개 문서화된 API에서 하위 호환성을 유지하기 위해 최선을 다하고 있음을 의미합니다. 또한 이제 주요 버전에 대한 버그 수정 지원을 제공하기 시작하여 다음 주요 버전이 출시된 후에도 6개월 동안 계속 지원되는 브랜치를 사용할 수 있습니다. 이는 1.x 및 0.x 주요 시리즈부터 시작되며, 0.46.x 릴리스가 출시된 후 6개월 동안 버그 수정이 포함된 주기적인 패치 릴리스를 통해 1.0 이 계속 지원됩니다. 즉, 0.46.x 은 2024-08까지 지원됩니다. 새 정책에 대한 자세한 내용은 여기에서 확인할 수 있습니다:
이번 릴리스에서 가장 중요한 것은 패키지의 변화입니다. 키스킷이 요소 모델을 도입한 2018-12년 키스킷 0.7 릴리스 이후, 여러분이 설치하게 될 qiskit 패키지는 키스킷을 구성하는 요소들을 결합하여 설치하는 메타 패키지(또는 패키지들의 패키지)였습니다. 이전 릴리스에서 발표한 대로(자세한 내용은 0.44.0, 0.45.3 및 0.46.0 릴리스 노트와 이 블로그 게시물을 참조하세요) 1.0 릴리스에서는 핵심 SDK만 노출하는 단일 qiskit 패키지(이전에는 qiskit-terra)로의 전환을 완료했습니다. 즉, 릴리스 >= 1.0.0 의 경우 qiskit-terra 패키지 사용을 중단하고 qiskit 만 게시합니다. 이 패키징 구조 변경은 Python 패키지 인스톨러 pip 에서 완전히 지원되지 않으므로 pip install -U qiskit 를 사용하여 키스킷 0.46.0 에서 1.0.0 로 업그레이드하는 것은 불가능하다. 키스킷( 1.0.0 )으로 업그레이드하려면 별도의 가상 환경을 만들어 설치를 격리할 것을 적극 권장합니다. 패키징 변경 사항과 다양한 시나리오에서 키스킷을 설치하는 방법( 1.0.0 )을 설명하는 자세한 마이그레이션 가이드는 여기에서 확인할 수 있습니다:
https://qisk.it/1-0-packaging-migration
모든 주요 릴리스와 마찬가지로 키스킷( 1.0.0 )에도 수많은 새로운 기능이 추가되었으며, 이번 릴리스의 주요 특징은 다음과 같습니다:
- 클래스의
QuantumCircuit클래스의 내부data구조가 Rust에서 재작성되어 메모리 효율성이 크게 향상되었습니다QuantumCircuit객체의 메모리 효율을 크게 개선하기 위해 내부 구조를 재작성했습니다.- 의 새로운 버전의 프리미티브 인터페이스 정의가
qiskit.primitives의 새로운 버전의BaseSamplerV2및BaseEstimatorV2추상 클래스. 이 새로운 버전의 인터페이스에는 프리미티브에 대한 벡터화된 호출을 수행하는 기능이 추가되어 매개변수 값 집합과 관측 가능 항목에 대한 스윕을 효율적으로 지정할 수 있습니다.- 새로운 실험적인 네이티브 OpenQASM 3 파서
qiskit.qasm3.loads_experimental()와qiskit.qasm3.load_experimental(). 이 새로운 구문 분석기는 아직 개발 중이며 몇 가지 제한 사항이 있으며 아직 실험 단계에 있습니다. 그러나 사용 가능한 경우 새 구문 분석기는 훨씬 더 빠르고 진단 오류 메시지가 개선되어 OpenQASM 3 프로그램이 잘못된 부분을 디버깅할 수 있습니다. 이 새로운 구문 분석기는 Rust로 작성되었으며 새로 개발된 구문 분석용 Rust 라이브러리( OpenQASM3 )를 기반으로 합니다: https://github.com/Qiskit/openqasm3_parser
마지막으로, 키스킷 1.0.0 릴리스는 지난 7년간의 개발 기간 동안 쌓인 기술적 부채를 정리할 수 있는 기회였습니다. 키스킷 1.0.0 릴리스에는 DeprecationWarning가 거의 배포되지 않으며, 동시에 1.0.0 릴리스 노트의 업그레이드 섹션이 평소보다 길어진 것을 알 수 있습니다. 이는 기술 부채 정리의 직접적인 결과입니다. 0.46.x 에서 1.0.0 으로 마이그레이션하는 데 도움을 드리기 위해 릴리즈 노트 외에 전용 마이그레이션 가이드도 게시했으며, 여기에서 확인할 수 있습니다:
이 가이드는 릴리스 노트를 보완하고 0.46.0 릴리스에서 더 이상 사용되지 않는 기능이 제거된 후 API 변경 사항을 마이그레이션하는 방법에 대한 구체적인 조언을 제공하기 위한 것입니다.
회로 기능
-
메서드에 새 인수
annotated를 추가했습니다QuantumCircuit.inverse(),circuit.Instruction.inverse()와.inverse()메서드에Instruction서브 클래스(SwapGate또는SGate)를 선택적으로 반환하는AnnotatedOperation.annotated의 기본값은False이며 메서드의 기존 동작에 해당합니다. 또한 명시적으로 정의된inverse메서드가 있는 표준 게이트의 경우, 예를 들어annotated인수는 둘 다 효과가 없습니다:SwapGate().inverse(annotated=False) SwapGate().inverse(annotated=True)를 반환하고
SwapGate를 반환합니다:SGate().inverse(annotated=False) SGate().inverse(annotated=True)반환하면
SdgGate. 명시적으로 정의된 역방향이 없는 사용자 지정 지침의 경우 차이가 나타납니다.annotated=False을 사용하면 이전과 마찬가지로 재귀적으로 반전된 정의가 포함된 새 명령어를 반환합니다.annotated=True가 반환하는 반면AnnotatedOperation로 수정된 명령어를 나타내는InverseModifier. -
에 커뮤테이션 라이브러리를 추가했습니다
CommutationChecker. 이 라이브러리는 파라미터화할 수 없는 표준 게이트의 모든 정류 관계를 사전으로 저장하여 런타임에 효율적으로 조회할 수 있도록 합니다. 이렇게 하면 실행 속도가 빨라집니다CommutationChecker클래스와 더 나아가CommutationAnalysis트랜스파일러 패스는 매개변수화할 수 없는 두 개의 표준 게이트가 통근하는지 계산하는 대신 라이브러리에서 이를 조회하기만 하면 되기 때문에 실행 속도가 빨라집니다.또한
CommutationChecker가 리팩터링되어 이제 정류 라이브러리에 없는 캐시된 정류 관계의 수에 상한이 설정되었습니다. 이것은 해결되었습니다: #8020 및 #7101 -
QuantumCircuit.assign_parameters()이제 매핑 형식의 입력에서 문자열 키를 사용할 수 있습니다. 이 이름은 해당 인스턴스를 조회하는 데 사용됩니다Parameter인스턴스를get_parameter(). 이렇게 하면 됩니다:from qiskit.circuit import QuantumCircuit, Parameter a = Parameter("a") qc = QuantumCircuit(1) qc.rx(a, 0) qc.assign_parameters({"a": 1}) == qc.assign_parameters({a: 1}) -
QuantumCircuit에는 두 가지 새로운 메서드가 있습니다,get_parameter()와has_parameter()각각 이름으로 회로에 사용된Parameter인스턴스를 이름으로 검색하고, 이름이 일치하는 매개변수(또는 주어진 정확한 인스턴스)가 회로에서 사용되는지 여부에 대한 부울을 반환합니다. -
A
uuid속성이qiskit.circuit.Parameter클래스에 프로퍼티가 추가되었습니다. 고급 사용 사례에서는 이 속성을 사용하여qiskit.circuit.Parameter인스턴스를 생성하는 데 사용할 수 있습니다. -
새로운 메서드가 추가되었습니다,
ParameterExpression.numeric()완전히 바인딩된 매개변수 표현식을 기호 평가 결과를 정확하게 설명하는 가장 제한적인 기본 제공 Python 숫자 유형으로 변환하는 메서드를 추가했습니다. 예를 들어, 기호 정수는 기호 실수는int가 되고, 기호 실수는 a가 되고float가 되고 복소수는complex. 이 메서드에는symengine의 평가 컨텍스트의 특성에 대한 몇 가지 해결 방법이 포함되어 있으며, 이로 인해 때때로 잘못된 결과가 발생할 수 있습니다complex또는float를 직접 호출할 때 잘못된 결과를 초래할 수 있습니다.
기본형 기능
-
프리미티브 버전 2는 샘플러와 추정기 모두에 대한 새로운 베이스 클래스와 함께 입력 및 출력에 대한 새로운 유형을 통해 도입되었습니다. 이 새 버전은 기본
run()메서드에 대한 벡터화된 호출을 수행하여 매개변수 값 집합과 관측값에 대한 스윕을 효율적으로 지정할 수 있도록 하는 데 중점을 두고 있습니다. 참조StatevectorSampler및StatevectorEstimatorV2 프리미티브의 참조 구현을 참조하세요.또한, 추정기에는
precision인수가 추가되었습니다run()메서드에 기대값 추정치의 목표 정밀도를 지정하는 인수를 추가할 수 있습니다. 마찬가지로, 샘플러는shots을 옵션에서 메서드의 인수로 옮겼습니다run()메서드의 인수로 이동했습니다. 샘플러는 또한 모든 샷에서 출력(예: 비트 문자열)을 반환하도록 변경되었습니다Counts-반환하는 대신 모든 샷의 출력(예: 비트 문자열)을 반환하고 별도의ClassicalRegisters. 이를 통해 파생 클래스는 고전적인 제어 흐름을 가진 회로에 대한 샘플러 지원을 구현할 수 있습니다.원시 V2 기본 클래스는 다음과 같습니다:
입력 및 출력에 사용되는 새로운 유형은 다음과 같습니다:
SamplerPubLike샘플러 입력의 원시 통합 블록 ( PUB ); 샘플러에 허용되는 입력의 조합 유형입니다EstimatorPubLike: 추정기 입력의 원시 통합 블록 ( PUB ); 추정기에 허용되는 입력의 유니온 유형입니다PubResult단일 PUB 실행으로 인한 데이터 및 메타데이터DataBin: 단일 PUB 실행의 데이터를 저장하는 네임스페이스BitArray고밀도 형식의 배열 값 비트 값 모음입니다PrimitiveResult의 이터러블PubResult를 메타데이터와 함께
-
참조 구현
StatevectorEstimator의BaseEstimatorV2의 참조 구현이 추가되었습니다. 아래 예에서 볼 수 있듯이 이 추정기(및 모든 V2 추정기)는 특정 회로에 연결된 관측값 배열 및/또는 매개변수 값 집합 배열을 제공하는 것을 지원합니다.추정기 프리미티브 통합 블록( PUB )이라고 하는
(circuit, observables, <optional> parameter values, <optional> precision)의 각 튜플은 자체 배열 기반 결과를 생성합니다.run()메서드는 한 번에 여러 개의 퍼브를 지정할 수 있습니다.from qiskit.circuit import Parameter, QuantumCircuit from qiskit.primitives import StatevectorEstimator from qiskit.quantum_info import Pauli, SparsePauliOp import matplotlib.pyplot as plt import numpy as np # Define a circuit with two parameters. circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(0, 1) circuit.h(0) # Define a sweep over parameter values, where the second axis is over # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Define three observables. Many formats are supported here including # classes such as qiskit.quantum_info.SparsePauliOp. The inner length-1 # lists cause this array of observables to have shape (3, 1), rather # than shape (3,) if they were omitted. observables = [ [SparsePauliOp(["XX", "IY"], [0.5, 0.5])], [Pauli("XX")], [Pauli("IY")] ] # Instantiate a new statevector simulation based estimator object. estimator = StatevectorEstimator() # Estimate the expectation value for all 300 combinations of # observables and parameter values, where the pub result will have # shape (3, 100). This shape is due to our array of parameter # bindings having shape (100,), combined with our array of observables # having shape (3, 1) pub = (circuit, observables, params) job = estimator.run([pub]) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # Error-bar information is also available, but the error is 0 # for this StatevectorEstimator. result.data.stds # Pull out the array-based expectation value estimate data from the # result and plot a trace for each observable. for idx, pauli in enumerate(observables): plt.plot(result.data.evs[idx], label=pauli) plt.legend() -
참조 구현
StatevectorSampler의BaseSamplerV2의 참조 구현이 추가되었습니다. 아래 예시에서 볼 수 있듯이 이 샘플러(및 모든 V2 샘플러)는 단일 회로에 바인딩할 파라미터 값 세트의 배열을 제공하는 기능을 지원합니다.샘플러 프리미티브 통합 블록( PUB )이라고 하는
(circuit, <optional> parameter values, <optional> shots)의 각 튜플은 자체 배열 기반 결과를 생성합니다.run()메서드는 한 번에 여러 개의 퍼브를 지정할 수 있습니다.from qiskit.circuit import ( Parameter, QuantumCircuit, ClassicalRegister, QuantumRegister ) from qiskit.primitives import StatevectorSampler import matplotlib.pyplot as plt import numpy as np # Define our circuit registers, including classical registers # called 'alpha' and 'beta'. qreg = QuantumRegister(3) alpha = ClassicalRegister(2, "alpha") beta = ClassicalRegister(1, "beta") # Define a quantum circuit with two parameters. circuit = QuantumCircuit(qreg, alpha, beta) circuit.h(0) circuit.cx(0, 1) circuit.cx(1, 2) circuit.ry(Parameter("a"), 0) circuit.rz(Parameter("b"), 0) circuit.cx(1, 2) circuit.cx(0, 1) circuit.h(0) circuit.measure([0, 1], alpha) circuit.measure([2], beta) # Define a sweep over parameter values, where the second axis is over. # the two parameters in the circuit. params = np.vstack([ np.linspace(-np.pi, np.pi, 100), np.linspace(-4 * np.pi, 4 * np.pi, 100) ]).T # Instantiate a new statevector simulation based sampler object. sampler = StatevectorSampler() # Start a job that will return shots for all 100 parameter value sets. pub = (circuit, params) job = sampler.run([pub], shots=256) # Extract the result for the 0th pub (this example only has one pub). result = job.result()[0] # There is one BitArray object for each ClassicalRegister in the # circuit. Here, we can see that the BitArray for alpha contains data # for all 100 sweep points, and that it is indeed storing data for 2 # bits over 256 shots. assert result.data.alpha.shape == (100,) assert result.data.alpha.num_bits == 2 assert result.data.alpha.num_shots == 256 # We can work directly with a binary array in performant applications. raw = result.data.alpha.array # For small registers where it is anticipated to have many counts # associated with the same bitstrings, we can turn the data from, # for example, the 22nd sweep index into a dictionary of counts. counts = result.data.alpha.get_counts(22) # Or, convert into a list of bitstrings that preserve shot order. bitstrings = result.data.alpha.get_bitstrings(22) print(bitstrings)
제공자 기능
-
새 클래스를 추가했습니다,
GenericBackendV2클래스를qiskit.providers.fake_provider모듈에 새 클래스, 를 추가했습니다. 이 클래스는 구성 가능하며, 로컬에서 실행할 수 있는BackendV2백엔드 인스턴스를 로컬에서 실행할 수 있습니다(가짜 백엔드의 정신에 따라). 사용자는 수동 타겟 구성 없이도 큐비트 수, 베이시스 게이트, 커플링 맵, 동적 회로(제어 흐름 명령어) 실행 기능, 명령어 보정 및 백엔드의 측정 타임스텝을 구성할 수 있습니다. 큐비트 및 게이트 속성(지속 시간, 오류)은 기본 범위에서 무작위로 샘플링하여 생성됩니다. 이 무작위 생성을 위한 시드는 백엔드 출력의 재현성을 보장하기 위해 고정할 수 있습니다. 이 백엔드는 표준 라이브러리의 게이트만 지원한다는 점에 유의하세요. 보다 유연한 백엔드가 필요한 경우, 번역에 사용할 객체를 직접 인스턴스화하는Target객체를 직접 인스턴스화할 수 있습니다.사용 예 1:
from qiskit import QuantumCircuit, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a simple circuit circuit = QuantumCircuit(3) circuit.h(0) circuit.cx(0,1) circuit.cx(0,2) circuit.measure_all() circuit.draw('mpl') # Define backend with 3 qubits backend = GenericBackendV2(num_qubits=3) # Transpile and run transpiled_circuit = transpile(circuit, backend) result = backend.run(transpiled_circuit).result()사용 예 2:
from qiskit import QuantumCircuit, ClassicalRegister, transpile from qiskit.providers.fake_provider import GenericBackendV2 # Create a circuit with classical control creg = ClassicalRegister(19) qc = QuantumCircuit(25) qc.add_register(creg) qc.h(0) for i in range(18): qc.cx(0, i + 1) for i in range(18): qc.measure(i, creg[i]) with qc.if_test((creg, 0)): qc.ecr(20, 21) # Define backend with custom basis gates and control flow instructions backend = GenericBackendV2( num_qubits=25, basis_gates=["ecr", "id", "rz", "sx", "x"], control_flow=True, ) #Transpile transpiled_qc = transpile(qc, backend)참고이 클래스에서 생성된 노이즈 속성은 구체적인 양자 장치를 모방하지 않으므로 구체적인 동작을 측정하는 데 사용해서는 안 됩니다. 이는 실제 양자 시스템의 특정 노이즈 값에 묶이지 않는 백엔드 인터페이스 기능을 테스트하는 데 사용할 수 있는 '합리적인 기본값'입니다. 기존 디바이스에 대한 보다 정확한 시뮬레이션을 위해 실제 백엔드에서 제공되는 기능을 사용하여 노이즈 모델을 수동으로 빌드할 수 있습니다
qiskit_aer. -
모듈은 이제
qiskit.providers.fake_provider모듈에는 이제 일련의 일반 가짜 백엔드가 포함되어 있습니다BackendV1인터페이스를 따르는 일련의 일반 가짜 백엔드를 포함합니다. 더 이상 사용되지 않는FakeProvider(FakeVigo,FakeTokyo, 등 )에 노출된 스냅샷 기반 가짜 백엔드의 대안으로 도입되었습니다. 새로운 가짜 백엔드 목록에는 다음이 포함됩니다:-
펄스 기능이 없는 백엔드:
-
펄스 기능이 있는 백엔드:
다음 패턴에 따라 가져올 수 있습니다:
from qiskit.providers.fake_provider import Fake5QV1. 백엔드 속성에 대한 자세한 내용은 각 백엔드의 API 문서에서 확인할 수 있습니다. -
OpenQASM 기능
-
이제
qiskit.qasm3패키지에는 이제 OpenQASM 3 프로그램을 다음과 같이 읽기 위한 내장된 러스트 기반 파서가 포함되어 있습니다QuantumCircuit에 있는qiskit.qasm3.load_experimental()와loads_experimental(). 이는 일반적으로 기존의 순수 Pythonload()및loads()함수를 사용하는 경우,qiskit-qasm3-import을 추가로 설치해야 합니다.예를 들어, 20,000개의 인스트럭션이 얽혀 있는
QuantumCircuit:import numpy as np import qiskit.qasm3 from qiskit.circuit.library import RealAmplitudes qc = RealAmplitudes(100, reps=100, flatten=True) qc = qc.assign_parameters(np.random.rand(qc.num_parameters)) oq3 = qiskit.qasm3.dumps(qc)이전
qasm3.loads()은 결과 OpenQASM 3 프로그램을 로드하는 데 약 7.3s 이 걸렸지만qasm3.loads_experimental()는 일반 맥북 프로( i7, 2020)에서 300ms 으로 걸렸으며, 이는 25x 의 속도 향상입니다!이 프리뷰 버전에서는 실험적인 구문 분석기가 지원하는 기능 세트가 매우 제한적이지만, 키스킷 측과 네이티브 Rust 기반 구문 분석기가 모두 개선됨에 따라 확장될 예정입니다.
이 새로운 구문 분석기의 주요 목표 중 하나는 속도 향상과 함께 최고 품질의 오류 진단 기능을 제공하는 것입니다. 구문 분석기의 다른 부분과 마찬가지로 현재 진행 중인 작업이지만, 실험용 구문 분석기로 잘못된 OpenQASM 3 프로그램을 구문 분석할 때 훨씬 더 높은 품질의 오류 메시지가 표시되기 시작할 것입니다.
-
OpenQASM 3 내보내기(
dump()및dumps()함수 참조qiskit.qasm3)는 이제 OpenQASM 3에서switch문의 안정화된 구문을 기본적으로 지원합니다.switch문의 사전 인증 구문은 내보내기의 인수에ExperimentalFeatures.SWITCH_CASE_V1플래그를 사용하여 내보내기의experimental인수에 추가할 수 있습니다. 안정화된 구문에는 기능 플래그가 필요하지 않지만 아직 업데이트되지 않은 다른 도구와 인터페이스하는 경우 실험적 플래그를 전달해야 할 수 있습니다.안정화된 양식의 구문은
break문 종료와 관련하여 약간 달라졌으며(더 이상 필요하거나 허용되지 않음), 여러 개의 대소문자가 이제 C 스타일 폴스루를 사용하지 않고 단일case줄로 결합됩니다. 자세한 내용은 스위치 케이스 구조에 대한 OpenQASM 3 문서를 참조하세요.
QPY 기능
-
새로운 경고 클래스를 추가했습니다,
QPYLoadingDeprecatedFeatureWarning를 QPY 모듈에 추가했습니다. 이 클래스를 사용하면 재귀적으로 호출되는 많은 QPY 로딩 함수의 경우처럼 사용되지 않는 기능이 호출 스택의 가변 지점에서 액세스되는 경우에도 사용 중단 경고가 표시될 수 있습니다. -
함수에 새 플래그인
version를 추가했습니다qpy.dump()함수에 추가했습니다. 이를 통해qpy.dump()를 선택적으로 사용하여 QPY 형식 버전이 내보낼 정수 값을 지정할 수 있습니다. 이 기능은 이전 버전의 키스킷에서 로드할 QPY 파일을 생성해야 할 때 유용합니다. 그러나 지원되는 버전은 제한되어 있으며, 기본 버전인 최신 QPY 버전과 호환 QPY 버전인 버전 10 (키스킷에 소개된 버전 0.45.0 ) 사이의 버전만 사용할 수 있습니다. 호환성 버전은 전체 1.x.y 주요 버전 릴리스 시리즈에 대해 고정된 상태로 유지됩니다. 이것은 호출 시 QPY 형식의 하위 호환성 보장을 변경하지 않습니다qpy.load()를 호출할 때 이전 버전의 QPY를 릴리스하여 0.x 및 1.x 릴리스 시리즈 간의 호환성 및 상호 운용성을 유지할 수 있도록 할 뿐입니다.
양자 정보 특성
-
안정제 상태를 생성하는
qiskit.quantum_info.StabilizerState.from_stabilizer_list()메서드를 추가하여 안정제 목록에서 안정제 상태를 생성합니다:from qiskit.quantum_info import StabilizerState stabilizer_list = ["ZXX", "-XYX", "+ZYY"] stab = StabilizerState.from_stabilizer_list(stabilizer_list) -
SparsePauliOp.from_operator()는 이제 Hatznko, Binkowski, Gupta(2023) 에서 제시된 "텐서화된 폴리 분해 알고리즘"의 구현을 사용합니다. 이 방법은 이제 몇 배 더 빨라졌습니다. 예를 들어, 일반 소비자용 맥북 프로(Intel i7, 2020)에서 임의의 10-큐비트 연산자를 약 250ms 안에 분해할 수 있습니다.
합성 기능
-
추가
qiskit.synthesis.synth_circuit_from_stabilizers()주어진 일련의 안정기에 의해 안정화된 상태를 출력하는 회로를 반환하는 함수를 추가했습니다. -
이제 AQC 단일 합성 플러그인 방식은 기본적으로 더 빠른 목적 함수 평가를 사용하므로 합성 시간이 크게 개선됩니다.
-
새로운 합성 방법 추가
synth_qft_line()을 추가하여 선형 근접 이웃 연결을 위한 QFT 회로의 새로운 합성 방법을 추가하여 SABRE에 비해 많은 수의 큐비트에 대한 SWAP 수를 크게 줄였습니다. -
클래스
TwoQubitWeylDecomposition클래스가 공개 API에 추가되었습니다qiskit.synthesis. 이 클래스를 사용하면 2쿼비트 단위의 웨일 분해를 적용할 수 있습니다. 현재 제거된qiskit.quantum_info.synthesis모듈에서 비공개 클래스일 때 이전에 이 클래스를 임포트했다면 임포트 경로를 업데이트해야 합니다.
트랜스파일러 기능
-
새로운 예외 클래스가 추가되었습니다:
InvalidLayoutError. 이것은 사용자가 제공한 레이아웃이 유효하지 않을 때 발생하는TranspilerError서브클래스로, 사용자가 제공한 레이아웃이 유효하지 않을 때(크기 불일치, 큐비트 중복 등) 발생합니다. -
에 새 키워드 인수
num_processes를 추가했습니다transpile()및PassManager.run()메서드를 추가했습니다. 이렇게 하면 트랜스파일별로 사용자 구성 파일에서QISKIT_NUM_PROCS및num_processes필드를 모두 재정의할 수 있습니다. 예를 들어,from qiskit import transpile, QuantumCircuit qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() transpile([qc]*10, basis_gates=['u', 'cz'], num_processes=2)는 2개의 프로세스만 사용하여 10개의 입력 회로에 대해 트랜스파일을 실행하고 해당 호출에 대한 시스템 기본값, 환경 변수 또는 사용자 구성 파일을 재정의합니다
transpile()호출을 재정의합니다. -
새로운 트랜스파일러 패스를 추가했습니다,
OptimizeAnnotated를 추가하여 양자 회로에서 주석이 달린 연산을 최적화합니다.다음 예를 고려하십시오.
from qiskit.circuit import QuantumCircuit from qiskit.circuit.annotated_operation import ( AnnotatedOperation, InverseModifier, ControlModifier, ) from qiskit.circuit.library import CXGate, SwapGate from qiskit.transpiler.passes import OptimizeAnnotated # Create a quantum circuit with multiple annotated gates gate1 = AnnotatedOperation( SwapGate(), [InverseModifier(), ControlModifier(2), InverseModifier(), ControlModifier(1)], ) gate2 = AnnotatedOperation( SwapGate(), [InverseModifier(), InverseModifier()] ) gate3 = AnnotatedOperation( AnnotatedOperation(CXGate(), ControlModifier(2)), ControlModifier(1) ) qc = QuantumCircuit(6) qc.append(gate1, [3, 2, 4, 0, 5]) qc.append(gate2, [1, 5]) qc.append(gate3, [5, 4, 3, 2, 1]) # Optimize the circuit using OptimizeAnnotated transpiler pass qc_optimized = OptimizeAnnotated()(qc) # This is how the optimized circuit should look like gate1_expected = AnnotatedOperation(SwapGate(), ControlModifier(3)) gate2_expected = SwapGate() gate3_expected = AnnotatedOperation(CXGate(), ControlModifier(3)) qc_expected = QuantumCircuit(6) qc_expected.append(gate1_expected, [3, 2, 4, 0, 5]) qc_expected.append(gate2_expected, [1, 5]) qc_expected.append(gate3_expected, [5, 4, 3, 2, 1]) assert qc_optimized == qc_expectedgate1의 경우 주석이 달린 스왑 게이트의 수정자는 표준 형식으로 가져옵니다InverseModifier가 상쇄되고 두ControlModifier가 결합됩니다.gate2의 경우 모든 수정자가 제거되고 주석이 달린 연산이 기본 연산으로 대체됩니다.gate3의 경우 여러 개의 주석 레이어가 하나로 결합되어 있습니다.의 생성자는
OptimizeAnnotated패스의 생성자는 선택적 인자target,equivalence_library,basis_gates및recurse를 허용합니다.recurse이True(기본값)이고target또는basis_gates이 지정되면 패스는 대상에서 이미 지원되거나 동등성 라이브러리에 속한 게이트를 제외하고 재귀적으로 게이트의definition회로로 내려갑니다. 반면에target또는basis_gates을 지정하지 않거나recurse이False으로 설정된 경우 패스는 "최상위" 주석이 달린 연산만 합성합니다. 즉,definition회로로 재귀적으로 내려가지 않습니다. 이 동작은 주석이 달린 연산을 1쿼비트와 2쿼비트 게이트로 "언롤"하기 위해 호출해야 하는HighLevelSynthesis트랜스파일러 패스와 일치하며, 주석이 달린 연산을 1쿼비트 및 2쿼비트 게이트로 "언롤"하기 위해 호출해야 합니다. -
새로운
HighLevelSynthesisPluginforPermutationGate객체를 추가했습니다. 이 플러그인을 사용하려면 하이레벨 합성 구성을 정의할 때token_swapper을 지정하세요.이 합성 플러그인은 레이아웃이 설정되기 전이나 후에 실행할 수 있습니다. 합성이 성공하면 플러그인은 스왑 게이트로만 구성된 양자 회로를 출력합니다. 합성에 성공하지 못하면 플러그인은
None을 출력합니다.다음 코드는 새 플러그인을 실행하는 방법을 설명합니다:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes.synthesis.high_level_synthesis import HighLevelSynthesis, HLSConfig # This creates a circuit with a permutation gate. qc = QuantumCircuit(8) perm_gate = PermutationGate([0, 1, 4, 3, 2]) qc.append(perm_gate, [3, 4, 5, 6, 7]) # This defines the coupling map. coupling_map = CouplingMap.from_ring(8) # This high-level-synthesis config specifies that we want to use # the "token_swapper" plugin for synthesizing permutation gates, # with the option to use 10 trials. synthesis_config = HLSConfig(permutation=[("token_swapper", {"trials": 10})]) # This creates the pass manager that runs high-level-synthesis on our circuit. # The option use_qubit_indices=True indicates that synthesis is run after the layout is set, # and hence should preserve the specified coupling map. pm = PassManager( HighLevelSynthesis( synthesis_config, coupling_map=coupling_map, target=None, use_qubit_indices=True ) ) qc_transpiled = pm.run(qc) -
두 개의 새로운 인수
matrix_based와max_qubits를 트랜스파일러 패스 생성자에 추가했습니다CommutativeInverseCancellation트랜스파일러 패스의 생성자에 두 개의 인수를 추가했습니다.matrix_based이True일 때 패스는 행렬 표현을 사용하여 두 연산이 서로의 역수인지 확인합니다. 이렇게 하면 검사가 더욱 강력해지고, 최대 위상이 반전된 연산 쌍을 취소하는 동시에 그에 따라 회로의 전역 위상을 업데이트할 수 있습니다. 이렇게 하면 일반적으로 런타임이 증가하는 대신 더 많은 시간을 단축할 수 있습니다.max_qubits인수는 행렬 기반 정류성 및 역검사에서 큐비트 수를 제한합니다. 예를 들어,import numpy as np from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(1) circuit.rz(np.pi / 4, 0) circuit.p(-np.pi / 4, 0) passmanager = PassManager(CommutativeInverseCancellation(matrix_based=True)) new_circuit = passmanager.run(circuit)이 패스는
RZ및P게이트를 취소하고 회로의 글로벌 위상을 로 조정할 수 있습니다. -
새로운 함수가 추가되었습니다,
high_level_synthesis_plugin_names()를 사용하여 지정된 작업 이름에 대해 설치된 하이 레벨 합성 플러그인 목록을 가져올 수 있습니다.
시각화 기능
-
text및mpl출력은QuantumCircuit.draw()및circuit_drawer()회로 서랍 기능의 출력은 이제 작동에 대한 자세한 정보를 표시합니다AnnotatedOperation.AnnotatedOperation.modifiers에ControlModifier가 포함되어 있으면 제어 게이트와 동일한 방식으로 작동이 표시됩니다. 만약InverseModifier또는PowerModifier를 사용하면 기본 작업 이름과 함께 표시됩니다. 예를 들어,from qiskit.circuit import ( AnnotatedOperation, ControlModifier, PowerModifier, InverseModifier, QuantumCircuit ) from qiskit.circuit.library import SGate annotated_op = AnnotatedOperation(SGate(), [PowerModifier(3.4), ControlModifier(3), InverseModifier()]) qc = QuantumCircuit(4) qc.append(annotated_op, range(4)) qc.draw("mpl")
기타 기능
-
새로운 경고 기본 클래스가 추가되었습니다,
QiskitWarning. 키스킷은 계속해서 내장된 Python 경고(예를 들어DeprecationWarning)이 가장 적절한 경우, 키스킷에 더 특정한 경우 경고는 하위 클래스인QiskitWarning. -
선택적 기능 테스터(
qiskit.utils.optionals)는 이제 완전히 발견되지 않은 선택적 종속성(정상적인 상황)과 발견되었지만 가져오기 중에 오류가 발생한 종속성을 구분합니다. 후자의 경우, 이제 설치 실패 또는 호환되지 않는 버전을 나타낼 수 있으므로OptionalDependencyImportWarning메시지가 표시되며, 이는 설치 실패 또는 호환되지 않는 버전을 나타낼 수 있습니다.
업그레이드 주의사항
-
키스킷 1.0 은 이제
rustworkx의 버전 0.14.0 이 필요합니다. 새로운token_swapperPermutationGate합성 플러그인HighLevelSynthesisPlugin. -
소스에서 키스킷을 빌드하기 위해 지원되는 최소 Rust 버전은 이제 1.70 이다. 이는 키스킷 0.45.x 및 0.46.0 릴리스 시리즈의 이전 최소 지원 Rust 버전인 1.64 에서 상향되었습니다.
-
Psutil에 대한 종속성이 제거되었습니다. Psutil 라이브러리는 이전에는 물리적 CPU 수와 총 시스템 메모리를 감지하는 데만 사용되었지만, 제공된 정보가 추가적인 종속성과 오버헤드를 정당화할 만큼 충분한 가치를 제공하지 못하므로 제거되었습니다. 즉, 내부에서 사용하는 기본 프로세스 수와
parallel_map()와 내부적으로 사용할 수 있는 함수parallel_map()와 같은transpile()및PassManager.run()는 이전 릴리스보다 병렬 프로세스를 더 많이 또는 더 적게 사용할 수 있습니다. 사용하는 프로세스 수를 조정하려면 해당 함수에 새로운num_processes인수를 사용하거나, 키스킷이 잠재적으로 사용하는 프로세스 수를 조정해야 하는 경우 사용자 구성 파일의QISKIT_NUM_PROCS환경 변수 또는num_processes필드(자세한 내용은 로컬 구성 가이드 참조)를 사용할 수 있습니다. -
scoped_parameters및search_parameters메서드가 클래스에서 제거되었습니다ScheduleBlock클래스에서 제거되었습니다. 이 메서드들은Parameter인스턴스의 매개 변수에 부분적으로 연결된 객체를 반환하지만ScheduleBlock인스턴스의 매개 변수에 부분적으로 연결된 객체를 반환하지만 이러한 객체를 사용하여 값을 할당하는 것은 올바르게 작동하지 않습니다. 사용자는ScheduleBlock.parameters를 대신 사용하고ScheduleBlock.references를 반복하고 하위 참조의Schedule.parameters속성을 사용하여 매개변수가 어떤 서브루틴에 사용되는지 구분해야 합니다. 자세한 내용은 #11654를 참조하세요. -
주입하는 로직을 제거했습니다
QuantumCircuit및Gate연산을 펄스 컨텍스트(pulse.builder.call()), 이는 키스킷에서 더 이상 사용되지 않는 레거시 동작이었다 0.46. 펄스 일정은 전체 일정 컨텍스트로 구축해야 하며, 회로와 게이트는 더 높은 수준의 추상화입니다.여기에는 관련 기능의 제거가 포함됩니다:
pulse.builder.call_gatepulse.builder.cxpulse.builder.u1pulse.builder.u2pulse.builder.u3pulse.builder.xpulse.builder.active_transpiler_settingspulse.builder.active_circuit_scheduler_settingspulse.builder.transpiler_settingspulse.builder.circuit_scheduler_settings
default_transpiler_settings및default_circuit_scheduler_settings인수는pulse.builder.build()에 대한 인수도 마찬가지로 제거됩니다.from qiskit import transpile, schedule, QuantumCircuit, pulse from qiskit.providers.fake_provider import Fake7QPulseV1 backend = Fake7QPulseV1() # Create a schedule from a hardware-based circuit. qc = QuantumCircuit(2) qc.cx(0, 1) qc = transpile(qc, backend) sched = schedule(qc, backend) # These pulse schedules can still be called in builder contexts. with pulse.build(backend) as qc_sched: pulse.call(sched) # Schedules for certain operations can also be directly retrieved # from BackendV1 instances: sched = backend.defaults().instruction_schedule_map.get('x', (0,)) # ... and from BackendV2 instances: sched = backend.target['x'][(0,)].calibration -
심엔진에 필요한 최소 버전이 >= 0.11 로 상향되었습니다.
회로 업그레이드 노트
-
키스킷 0.45.0 에서 더 이상 사용되지 않는
Instruction.qasm메서드를 제거했습니다. 사용qiskit.qasm2.dump()대신QuantumCircuit대신 사용하세요. -
Bit.register및Bit.index속성이 제거됩니다. 키스킷 0.25 (2021-04년에 릴리스됨)에서 더 이상 사용되지 않습니다. 큐비트와 비트는 이제 컨텍스트의QuantumCircuit. 속성에 대한 대안은QuantumCircuit.find_bit()를 사용하여 회로 내에 포함된 모든 레지스터와 회로 내 비트의 인덱스를 찾는 것입니다. -
메서드
QuantumCircuit.bind_parameters는 키스킷 0.45 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 드롭인 대체 방법으로QuantumCircuit.assign_parameters()을 모든 기본값과 함께 드롭인 방식으로 대체할 수 있으며, 이전 방식에 비해 추가 기능도 노출합니다. -
에서
Int1,Int2,BooleanFunction,classical_function()가져오기qiskit.circuit는 이제 비활성화되었습니다. 대신, 객체를 가져오려면qiskit.circuit.classicalfunction서브모듈에서 객체를 가져오는데, 여기에는tweedledum패키지가 필요합니다. -
의
header및extension_lib데이터 전용 어트리뷰트는QuantumCircuit의 데이터 전용 속성은 키스킷 0.45 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이는 더 이상 사용되지 않는 OpenQASM 2 내보내기의 내부 세부 정보입니다. -
0.45 릴리스 이후 사용 중단 보류 중이며 0.46 릴리스에서 완전히 사용 중단된
qiskit.extensions모듈을 제거했습니다. 이 모듈의 다음 작업은 다음에서 사용할 수 있습니다qiskit.circuit.library:DiagonalGate,HamiltonianGateGate,Initialize,Isometry,MCGupDiag,UCGate,UCPauliRotGate,UCRXGate,UCRYGate,UCRZGate,UnitaryGate.
다음 개체가 제거되었습니다:
SingleQubitUnitary(대신library.UnitaryGate),Snapshot(Aer의 저장 지침으로 대체됨),ExtensionError,
와 함께 다음과 같은 회로 방법을 사용합니다:
QuantumCircuit.snapshot,QuantumCircuit.squ,QuantumCircuit.diagonal,QuantumCircuit.hamiltonian,QuantumCircuit.isometry및QuantumCircuit.iso,QuantumCircuit.uc,QuantumCircuit.ucrx,QuantumCircuit.ucry,QuantumCircuit.ucrz.
이러한 연산은 여전히 양자 회로에 적절한 명령을 추가하여 수행할 수 있습니다.
-
더 이상 사용되지 않고 중복된
QuantumCircuit메서드를 제거했습니다. 주요 내용은 다음과 같습니다.QuantumCircuit.cnot대신QuantumCircuit.cx(),QuantumCircuit.toffoli대신QuantumCircuit.ccx(),QuantumCircuit.fredkin대신QuantumCircuit.cswap(),QuantumCircuit.mct대신QuantumCircuit.mcx(),QuantumCircuit.i대신QuantumCircuit.id().
-
더 이상 설정할 수 없다
QuantumCircuit.metadata를None로 설정할 수 없습니다. 0.43.0. 유형은dict이므로 지우려면{}로 설정합니다. -
.Register.name_format어트리뷰트는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 더 이상 레지스터 이름에 대한 제한이 없으며, 정규식은[a-z][a-zA-Z0-9_]*입니다.
기본형 업그레이드 노트
- 클래스를 추가했습니다
BasePrimitiveJob클래스를 프리미티브에 대한 추상 잡 클래스로 추가하고PrimitiveJobinheritBasePrimitiveJob대신JobV1.
공급자 업그레이드 안내
-
함수에서 두 인수(
add_delay및filter_faulty)의 기본값을 변경했습니다convert_to_target()함수의 기본값을 변경했습니다. 이 변환 기능은 이제 기본적으로 지연 인스트럭션을 추가하고 오류 인스트럭션을 제거합니다. -
그리고
BackendProperties및PulseDefaults모델 객체에서 사용되는FakeOpenPulse2Q가 내부적으로 일관성을 유지하고 누락된 지침을 추가하도록 업데이트되었습니다. 이전 모델 오브젝트를 컴파일 대상으로 사용했다면 키스킷 0.46 으로 백엔드를 사용하고QuantumCircuit로 생성된transpile()로 내보내고qpy.dump를 사용하여 직렬화하면 이번 릴리스에서 액세스할 수 있습니다. -
qiskit.BasicAer으로 노출되는qiskit.providers.basicaer모듈은 0.46 릴리스에서 더 이상 사용되지 않음에 따라 제거되었습니다. 해당 기능은qiskit.quantum_info모듈과 새로운qiskit.providers.basic_provider모듈로 대체되었습니다.qiskit.providers.basicaer(qiskit.BasicAer)를 사용하던 것에서qiskit.providers.basic_provider로의 마이그레이션은 다음과 같이 수행할 수 있습니다:마이그레이션 소스대체qiskit.BasicAer새 공급자에 글로벌 인스턴스가 없는 경우 가져오기는 다음에서 수행해야 합니다 qiskit.providers.basic_providerqiskit.providers.basicaerbasic_providerBasicAerProviderBasicProviderBasicAerJobBasicProviderJobQasmSimulatorPyBasicSimulatorUnitarySimulatorPy사용 OperatorStatevectorSimulatorPy사용 Statevector주목할 만한 차이점은 새 공급자는 더 이상 글로벌 인스턴스(예:
BasicAer)를 통해 노출되지 않으므로from qiskit import BasicProvider을 수행하는 것이 유효하지 않다는 것입니다. 대신 공급자 클래스는 해당 서브모듈에서 가져와 수동으로 인스턴스화해야 합니다:from qiskit.providers.basic_provider import BasicProvider provider = BasicProvider() backend = provider.get_backend("basic_simulator")다음 예제는
BasicAer에서 세 시뮬레이터의 마이그레이션 경로를 보여줍니다.-
상태 벡터 시뮬레이터:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("statevector_simulator") statevector = backend.run(qc).result().get_statevector() # New path from qiskit.quantum_info import Statevector statevector = Statevector(qc) -
유니티 시뮬레이터:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) # Former path from qiskit import BasicAer backend = BasicAer.get_backend("unitary_simulator") result = backend.run(qc).result() # New path from qiskit.quantum_info import Operator result = Operator(qc).data -
Qasm 시뮬레이터:
from qiskit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.h(1) qc.cx(1,2) qc.measure_all() # Former path from qiskit import BasicAer backend = BasicAer.get_backend("qasm_simulator") result = backend.run(qc).result() # New path from qiskit.providers.basic_provider import BasicProvider backend = BasicProvider().get_backend("basic_simulator") result = backend.run(qc).result() # or, directly from qiskit.providers.basic_provider import BasicSimulator backend = BasicSimulator() result = backend.run(qc).result()
-
-
키스킷 0.46.0 에서 더 이상 사용되지 않는
ConfigurableFakeBackend클래스를 제거했습니다. 대신 적절한FakeBackend을 사용할 수 있습니다. -
더 이상 사용되지 않는
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
펄스 업그레이드 노트
-
더 이상 사용되지 않는 클래스 제거
qiskit.pulse.instructions.Call대체 펄스 지침이 제공되지 않습니다. -
InstructionToQobjConverter및QobjToInstructionConverter에서 더 이상 사용되지 않는 메서드를 제거했습니다. 해당 사용자는 다음과 같습니다.InstructionToQobjConverter.convert_acquire()InstructionToQobjConverter.convert_bundled_acquires()InstructionToQobjConverter.convert_set_frequency()InstructionToQobjConverter.convert_shift_frequency()InstructionToQobjConverter.convert_set_phase()InstructionToQobjConverter.convert_shift_phase()InstructionToQobjConverter.convert_delay()InstructionToQobjConverter.convert_play()InstructionToQobjConverter.convert_snapshot()QobjToInstructionConverter.convert_acquire()QobjToInstructionConverter.convert_set_phase()QobjToInstructionConverter.convert_shift_phase()QobjToInstructionConverter.convert_set_frequency()QobjToInstructionConverter.convert_shift_frequency()QobjToInstructionConverter.convert_delay()QobjToInstructionConverter.bind_pulse()QobjToInstructionConverter.convert_parametric()QobjToInstructionConverter.convert_snapshot()
이러한 공개 메서드는 모두 단일 진입점에서 암시적으로 호출되는 보호된 메서드로 대체됩니다. 즉, 클래스를 함수처럼 호출하는 것입니다.
-
qiskit.pulse.library.ParametricPulse클래스와 모든 하위 클래스가 제거됩니다. 이들은 2022-10에 릴리스된 키스킷 0.39 (qiskit-terra 0.22 )부터 더 이상 사용되지 않습니다. 대신SymbolicPulse를 사용하고 자세한 내용은 해당 문서를 확인하세요.
OpenQASM 업그레이드 노트
- 클래스의
qasm()메서드QuantumRegister와ClassicalRegister메서드가 제거되었습니다. 이는 OpenQASM 2 내보내기 레거시 구현의 내부 세부 사항이므로 교체할 필요가 없습니다. OpenQASM 2로 프로그램을 내보내려면qasm2.dump()또는qasm2.dumps().
QPY 업그레이드 노트
-
QPY의 최신 포맷 버전은 현재 버전 11이며, 실행 시 기본적으로 다음과 같이 출력됩니다
qpy.dump(). -
모듈 경로
qiskit.circuit.qpy_serialization는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. QPY 직렬화의 경우qiskit.qpy를 새 위치로 설정합니다.
양자 정보 업그레이드 노트
-
더 이상 사용되지 않는
__getitem__/__setitem__매직 메서드를 제거했습니다Clifford. 이 메서드는 2023-07년에 릴리스된 키스킷 0.44 이후 더 이상 사용되지 않습니다. 대신Clifford.tableau속성을 인덱싱하거나 반복합니다. -
0.46 릴리스 이후 더 이상 사용되지 않는
qiskit.quantum_info.synthesis모듈을 제거했습니다. 다음 개체가 다음으로 이동되었습니다qiskit.synthesis:OneQubitEulerDecomposer로 이동되었습니다qiskit.synthesis.one_qubitTwoQubitBasisDecomposer로 이동되었습니다qiskit.synthesis.two_qubitsXXDecomposer로 이동되었습니다qiskit.synthesis.two_qubitstwo_qubit_cnot_decompose()로 이동되었습니다qiskit.synthesis.two_qubits
이 기능은 0.46 릴리스에서 이미 더 이상 사용되지 않으므로 제거되었습니다: *
cnot_rxx_decompose이 기능은 이전 릴리스에서 이미 더 이상 사용되지 않으므로 제거되었습니다: *
decompose_clifford(대신synth_clifford_full()대신 사용) *decompose_cnotdihedral(대신synth_cnotdihedral_full()대신 사용) -
기능
process_fidelity(),average_gate_fidelity(),gate_error()와diamond_norm()함수는 키스킷 0.25.0 에서 더 이상 표시된 예상 유형에 임의의 입력을 강제로 시도하지 않습니다. 표시된 유형의 입력을 각 인수에 직접 전달합니다.
합성 업그레이드 노트
-
이전에 사용되지 않던 다음 함수는
qiskit.quantum_info에 있던 다음 기능이 제거되었습니다. 이러한 기능은 2023-01 키스킷 0.40.0 릴리스에서 더 이상 사용되지 않는 것으로 표시되었습니다.decompose_clifford대신qiskit.synthesis.synth_clifford_full()함수를 사용해야 합니다.decompose_cnotdihedral대신qiskit.synthesis.synth_cnotdihedral_full()함수를 사용해야 합니다.
트랜스파일러 업그레이드 노트
-
더 이상 사용되지 않는 방법
Target.aquire_alignment이 제거되었습니다. 키스킷 0.43 (2023-05 릴리스)에서 더 이상 사용되지 않는 것으로 표시되었습니다. 대신Target.acquire_alignment()방법을 사용해야 합니다. -
더 이상 사용되지 않는 함수 제거
qiskit.transpiler.preset_passmanagers.common.get_vf2_call_limit. 대신get_vf2_limits()을 사용하십시오. -
함수에서 기본적으로
approximation_degree!=1.0의 암시적 사용은generate_preset_pass_manager()함수의 암시적 사용이 비활성화되었습니다. 이전 기본값은 특히 트로터화 또는 아이덴티티에 가깝지만 확실히 같지는 않은 유사한 작업 실행을 포함하는 워크로드에서 과도하고 예기치 않은 근사값을 생성할 수 있습니다.이 변경으로 인해 내부 패스 관리자 생성 기본값이 원래의 의도인
transpile()와 일치하도록 합니다. 자세한 내용은 #8595를 참조하세요. -
qiskit.transpiler.passes.basis에서 더 이상 사용되지 않는Unroller클래스를 제거했습니다. 이 클래스는 키스킷( 0.45 )에서 더 이상 사용되지 않으며, 이 클래스를 사용하는 대신BasisTranslator와UnrollCustomDefinitions.참고
BasisTranslator와UnrollCustomDefinitions는EquivalenceLibrary객체를 전달해야 하므로Unroller와는 다른 인수를 사용합니다.이전에는
Unroller(basis_gates)을 사용할 수 있었지만 이제는 을 사용할 수 있습니다:from qiskit.circuit.library.standard_gates.equivalence_library import ( StandardEquivalenceLibrary as std_eqlib, ) pm = PassManager([ UnrollCustomDefinitions(std_eqlib, basis_gates) BasisTranslator(std_eqlib, basis_gates), ]) translated = pm.run(circuit) -
더 이상 사용되지 않는
NoiseAdaptiveLayout트랜스파일러 패스가 제거되었습니다. 키스킷 0.46.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 패스는 대부분 다음과 같이 대체되었습니다VF2Layout와VF2PostLayout로 대체되었으며, 백엔드의 보고된 노이즈 특성을 기반으로 레이아웃을 설정합니다. 패스와 함께layout_method플러그인("noise_adaptive")이 제거되었습니다. -
더 이상 사용되지 않는
CrosstalkAdaptiveSchedule트랜스파일러 패스가 제거되었습니다. 키스킷 0.46.0 에서 사용되지 않는 것으로 표시되었습니다. 이 패스는 내부 작동이 사용자 정의 속성의BackendProperties페이로드에 설정된BackendV1인스턴스의 페이로드에 설정된 커스텀 프로퍼티에 의존했기 때문입니다. 이러한 필드를 설정하는 백엔드가 없으므로 패스가 제거되었습니다. 사용자 지정 워크플로우를 위해 패스에 의존하는 경우 키스킷 0.46.x 에서 버전을 사용할 수 있습니다. -
0.46 릴리스 이후 더 이상 사용되지 않는
qiskit.transpiler.synthesis모듈을 제거했습니다. 다음 개체가 이동되었습니다:qiskit.transpiler.synthesis.aqc로 이전되었습니다qiskit.synthesis.unitary.aqc(qiskit.synthesis.unitary.aqc.AQCSynthesisPlugin제외)로 이전되었습니다.qiskit.synthesis.unitary.aqc.AQCSynthesisPlugin이qiskit.transpiler.passes.synthesis.AQCSynthesisPlugin로 이전되었습니다.qiskit.transpiler.synthesis.graysynth()이qiskit.synthesis.synth_cnot_phase_aam().qiskit.transpiler.synthesis.cnot_synth()이qiskit.synthesis.synth_cnot_count_full_pmh().
-
함수로 인스턴스를 호출할 때
target키워드 별칭이TwoQubitBasisDecomposer인스턴스를 함수로 호출할 때의 0.40.0 키워드 별칭은 키스킷에서 더 이상 사용되지 않음에 따라 제거되었습니다. 인수를 첫 번째 인자로 위치 지정하여 전달하거나 새 이름unitary을 사용해야 합니다. -
특수 트랜스파일러 패스
LinearFunctionsSynthesis는 키스킷 0.40.0 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 더 이상 사용되지 않는 이후에는 매우 얇은 래퍼로HighLevelSynthesis를 대신 사용해야 합니다. -
가져오기 경로
qiskit.transpiler.passes.scheduling.calibration_creators가 제거됩니다. 트랜스파일러는 이를 보관된 상태로 전달합니다,RZXCalibrationBuilder및RZXCalibrationBuilderNoEcho에서 직접 가져올 수 있습니다qiskit.transpiler.passes. -
가져오기 경로
qiskit.transpiler.passes.scheduling.rzx_templates가 제거됩니다. 가져와야 합니다rzx_templates()에서qiskit.transpiler.passes에서 직접 가져와야 합니다. -
패스 파이프라인 구성 패턴이 업그레이드되었습니다. 플로우 컨트롤러의 인스턴스화를 위해 아래에 표시된 구문 설탕이 제거되었습니다.
from qiskit.transpiler import PassManager pm = PassManager() pm.append(my_pass, condition=condition_callable, do_while=do_while_callable)이 키워드 인수 패턴을 사용하는 대신 흐름 컨트롤러를 명시적으로 인스턴스화해야 합니다.
from qiskit.passmanager import ConditionalController, DoWhileController from qiskit.transpiler import PassManager pm = PassManager() pm.append( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) )키워드 인자로는 불가능했던 컨트롤러의 중첩 순서를 관리할 수 있다는 점에 유의하세요. 지금은 추가 메서드를 호출할 이유가 없으므로 아래와 같이 패스 매니저의 생성자를 사용하여 파이프라인을 빌드할 수도 있습니다.
pm = PassManager( ConditionalController( DoWhileController(my_pass, do_while=do_while_callable), condition=condition_callable, ) ) -
내장 플로우 컨트롤러의 추가 메서드가 제거되었습니다. 해당 사용자는 다음과 같습니다.
ConditionalController.appendDoWhileController.appendFlowControllerLinear.append
플로우 컨트롤러의 작업 파이프라인은 고정되어 있으며 컨트롤러 인스턴스가 생성될 때 전달되어야 합니다.
-
passess메서드 제거PassManager및StagedPassManager의 메서드를 제거하여 포함된 패스를 사전 목록 형태로 반환했습니다. 그러나 이 형식은 조건 분기 및 중첩 조건을 포함할 수 있는 복잡한 전달 파이프라인을 효율적으로 표현하지 못합니다. 이 표현을 사용하는 대신 다음 패턴을 사용하세요pm = PassManager(...) pm.to_flow_controller().tasks이렇게 하면 선형화된 기본 작업 인스턴스를 튜플 형식으로 직접 반환합니다.
-
max_iteration인수가PassManager.append()및PassManager.replace(). -
키스킷에서 더 이상 사용되지 않는 다음 레거시 클래스는 패스 매니저 및 트랜스파일러 모듈에서 제거되었다 0.46:
qiskit.passmanager.flow_controllers.FlowControllerqiskit.transpiler.fencedobjs.FencedObjectqiskit.transpiler.fencedobjs.FencedPropertySetqiskit.transpiler.fencedobjs.FencedDAGCircuitqiskit.transpiler.runningpassmanager.RunningPassManager
시각화 업그레이드 안내
-
Matplotlib 을 사용하는 회로 시각화의 기본 스타일이
"iqp"으로 변경되어 IBM 퀀텀 플랫폼과 일치합니다. -
더 이상 사용되지 않는 모듈
qiskit.visualization.qcstyle이 제거되었습니다. 이 모듈은 키스킷 0.39.0 이후 더 이상 사용되지 않는 것으로 표시되었습니다. 대신qiskit.visualization.circuit.qcstyle을 사용해야 합니다. -
전달에 대한 지원은 더 이상 사용되지 않습니다
QuasiDistribution,ProbDistribution또는 배포 사전을 시각화의data인수에 전달하는 지원이 더 이상 지원되지 않습니다plot_histogram()시각화에 대한 지원이 제거되었습니다. 이 기능은 키스킷 0.39.0 릴리스(2022-10)에서 더 이상 사용되지 않는 것으로 표시되었습니다. 대신 히스토그램을 그리려는 경우QuasiDistribution,ProbDistribution또는 분포 사전에서 히스토그램을 그리려면 대신plot_distribution()함수를 사용해야 합니다. -
QiskitTimelineStyle의link_interval_dt키가 제거되었습니다. 새 이름link_interval_percent을 사용해야 합니다.
기타 업그레이드 주의사항
-
qiskit.Aer오브젝트는 키스킷 0.46 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 대신 드롭인 대체품인qiskit_aer.Aer을 사용할 수 있습니다. -
키스킷 0.46 에서 더 이상 사용되지 않음에 따라
qiskit.providers.aer에서 가져오기가 더 이상 작동하지 않습니다. 대신 드롭인 대체품인qiskit_aer에서 가져와야 합니다. -
Aer의 기본 시뮬레이션 기능이 더 이상 사용되지 않고 제거됨에 따라 펄스 작업은 더 이상 가짜 백엔드에서 지원되지 않습니다. 회로 객체의 컨텍스트가 아닌 펄스 레벨 시뮬레이션의 경우, Qiskit Dynamics와 같은 특수 목적 라이브러리를 사용하는 것을 고려하세요.
-
키스킷의
execute()기능이 제거되었습니다. 이 함수는 일부 트랜스파일 옵션으로 회로를 트랜스파일하고 일부 실행 옵션으로 백엔드에서 실행하는 것에 대한 높은 수준의 래퍼 역할을 합니다. 같은 작업을 수행하려면 명시적으로transpile()함수(적절한 트랜스파일 옵션 포함) 뒤에backend.run()(적절한 실행 옵션 포함)를 사용하면 됩니다.예를 들어, 달리기 대신
from qiskit import execute job = execute(circuit, backend)실행할 수 있습니다:
from qiskit import transpile new_circuit = transpile(circuit, backend) job = backend.run(new_circuit)또는
Sampler프리미티브는 더 이상 사용되지 않는execute()함수와 의미적으로 동일합니다. 클래스BackendSampler는 프리미티브를 지원하지 않는 백엔드를 위한 일반 래퍼입니다:from qiskit.primitives import BackendSampler sampler = BackendSampler(backend) job = sampler.run(circuit) -
더 이상 사용되지 않는
qiskit.IBMQ객체가 제거되었습니다. 이 별칭 개체는 키스킷 0.40.0 릴리스에서 사용되지 않는 것으로 표시되었습니다. 이 별칭 객체는 어트리뷰트 액세스를qiskit.providers.ibmq.IBMQ로 느리게 리디렉션했습니다.qiskit-ibmq-provider패키지는 이제 사용되지 않고 자체 네임스페이스를 유지하는qiskit-ibm-provider패키지로 대체되었으므로 이 별칭을 유지하는 것은 더 이상 적절하지 않습니다.qiskit.IBMQ별칭을 사용 중인 경우qiskit-ibm-provider패키지로 사용량을 마이그레이션해야 하며, 자세한 내용은 마이그레이션 가이드를 참조하세요. -
키스킷에서 일부 데이터를 대화형으로 시각화하기 위한 Jupyter 매직과 위젯을 포함했던 더 이상 사용되지 않는 모듈
qiskit.tools.jupyter을 제거했습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않습니다. 이 기능의 대부분은 기존qiskit-ibmq-provider패키지에 직접 연결되어 있었고 더 이상 유효하지 않아 모듈이 제거되었습니다. 비슷한 기능은 qiskit-ibm-provider 패키지의qiskit_ibm_provider.jupyter모듈에서 사용할 수 있습니다. -
이전에 추적 도구가 포함되어 있던 더 이상 사용되지 않는 모듈
qiskit.tools.monitor제거JobV1작업 인스턴스를 추적하는 도구를 포함했던qiskit-ibm-provider모듈을 제거했습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 패키지는 레거시qiskit-ibm-provider패키지에 직접 연결되어 있기 때문에 제거됩니다. -
이전에 모의 백엔드에 대한 임포트를 최신 위치로 리디렉션하는 데 사용되었던 더 이상 사용되지 않는 임포트 경로
qiskit.test.mock를 제거했습니다qiskit.providers.fake_provider. 이 모듈은 키스킷 0.37.0 에서 더 이상 사용되지 않는 것으로 표시되었습니다. 이 모듈을 사용하는 경우 가져오기를qiskit.test.mock에서qiskit.providers.fake_provider로 업데이트해야 합니다. -
qiskit.test모듈은 더 이상 공개 모듈이 아닙니다. 이것은 공개용으로 의도된 것이 아니며, 키스킷의 자체 테스트 스위트 외부에서 사용되지 않았습니다. 모든 기능은 키스킷 전용이며 대체 기능은 제공되지 않으므로 유사한 기능이 필요한 경우 자체 테스트 하네스에 포함시켜야 합니다. -
더 이상 사용되지 않는
qiskit.tools.visualization모듈이 제거되었습니다. 이 모듈은 키스킷 0.46.0 릴리스에서 더 이상 사용되지 않습니다. 이 모듈은 키스킷의 시각화 모듈의 원래 위치에서 레거시 리디렉션된 것으로, 키스킷의 시각화 모듈이qiskit.visualization키스킷 0.8.0 으로 이전되었다. 이 경로를 계속 사용하는 경우 가져오기 경로를qiskit.tools.visualization에서qiskit.visualization. -
더 이상 사용되지 않는
qiskit.tools.events모듈과 해당 모듈에 노출된qiskit.tools.progressbar유틸리티가 제거되었습니다. 이 기능은 키스킷 0.46.0 릴리스에서 더 이상 사용되지 않습니다. 이 모듈의 기능은 널리 사용되지 않았으며 tqdm과 같은 전용 패키지가 더 잘 다루고 있습니다. -
qiskit.tools모듈이 제거되었습니다. 이 모듈은 키스킷 0.46.0 에서 더 이상 사용되지 않습니다. 이 모듈의 모든 콘텐츠는qiskit.tools.parallel_map함수를 제외하고 제거되었으며, 대신 다음에서 사용할 수 있습니다qiskit.utils.parallel_map()에서 사용할 수 있습니다.
기본형 폐기
PrimitiveJob.submit()와PrimitiveJob.wait_for_final_state()메서드는 키스킷 0.46 에서 더 이상 사용되지 않음에 따라 제거되었습니다. 이는 공개적인 방법을 의도한 것이 아니라 잘못된 상속 구조의 유산이었습니다.
버그 수정
-
큐비트의 하위 집합만 요청된 경우 부적절한 측정 일정이 반환되던 문제를 수정했습니다. 이전에는 모든 큐비트에 대한 측정 일정이 반환되었습니다.
-
클래스가 아닌 작업을 표시할 때
text회로 서랍에서 발생하는 문제를 수정했습니다circuit.instruction.Instruction클래스가 아닌 작업을 표시할 때 발생하는 문제를 수정했습니다. 이러한 작업으로 인해 서랍이 실패할 수 있습니다. 예를 들면Clifford및AnnotatedOperation. -
트랜스파일러 패스의 문제를 수정했습니다
SetLayout트랜스파일러 패스에서 중복 항목이 포함된 유효하지 않은 정수 목록 입력이 발생하면 유효하지 않은Layout가 생성되고 이후의 트랜스파일러 패스가 암호화된 오류와 함께 실패하는 문제를 수정했습니다. 이제 이 문제는SetLayout.run()가 호출되면InvalidLayoutError정수 목록에 중복된 항목이 있음을 나타내는 오류가 발생합니다. -
QPY(
qpy.dump()와qpy.load())는 이제 주석이 달린 연산(()을 사용하여 양자 회로를 올바르게 직렬화 및 역직렬화합니다AnnotatedOperation). -
전화
copy()또는copy_empty_like()을 호출하면 이제BlueprintCircuit에 있는global_phase를 복사본에 올바르게 전달합니다. 이전에는 복사 후 글로벌 단계가 항상 0이었습니다. -
QuantumCircuit.compose()는 이제 올바르게CircuitError인수가qubits또는clbits인수가 중복될 때 올바르게 발생합니다. -
QPY(
qpy.dump()및qpy.load())는 이제 클리포드 연산자(Clifford). -
mpl서랍에서 텍스트가 상자 끝을 넘어 인쇄되는 문제를 수정했습니다SwitchCaseOp의 텍스트가 상자 끝을 넘어 인쇄되던 문제를 수정했습니다. -
의 큐비트 인수 방송이
QuantumCircuit.delay()의 큐비트 인자 방송은 이제 의도한 대로 각 큐비트에 대한Delay인스트럭션을 올바르게 생성합니다. 이전에는 특정 이터러블(예를 들어set와 같은) 이터러블이 주어지면 비정상적인 위치에서 실패할 수 있는 유효하지 않은 회로를 자동으로 생성했습니다. -
사전 설정 패스 관리자 사용 또는 실행 시 발생하는 문제를 수정했습니다
transpile()를 사용하거나 사전 설정된 패스 매니저(generate_preset_pass_manager())를 사용할 때 연결이 분리된 백엔드를 타깃팅할 때 출력에 추가 장벽을 추가하는 문제를 수정했습니다QuantumCircuit. 어떤 경우에는 여러 개의 단일 큐비트Barrier지시어가 회로의 최종 측정 직전에 출력 회로에 포함되는 경우도 있습니다. 이는 출력 회로에 잘못 추가된 연결에 대한 내부 처리로 인해 생성된 내부 상태였습니다. 수정 #11649 -
사용자가 특정 상황에서 게이트의 보정 데이터를 로드하려고 할 때 발생하는 오류를 수정했습니다
Target에서 게이트의 보정 데이터를 로드하려고 할 때 발생하는 오류를 수정했습니다. 이는 백엔드가 명령 정의에서 파형 펄스를 참조하지만 펄스 라이브러리에는 해당 파형 펄스를 포함하지 않는 등 일부 보정 데이터만 보고할 때 발생합니다. 이 상황에서는 키스킷 펄스 오브젝트를 빌드할 수 없어 캘리브레이션을 위한 펄스 스케줄을 빌드하지 못했습니다. 이제 캘리브레이션 데이터가 불완전하면Target는 보정이 전혀 보고되지 않은 것과 동일하게 취급하며 예외를 발생시키지 않습니다. -
메서드는 이제
Operator.power()메서드는 이제 문서화된 설명과 일치하는 부동 소수점 지수로 작동합니다. -
스왑 및 측정 명령어와 관련된 회로를 잘못 최적화하는
OptimizeSwapBeforeMeasure패스의 문제를 수정했습니다. 예를 들어,from qiskit import QuantumCircuit from qiskit.transpiler.passes import OptimizeSwapBeforeMeasure pass_ = OptimizeSwapBeforeMeasure() qc = QuantumCircuit(2, 1) qc.swap(0, 1) qc.measure(0, 0) qc.measure(0, 0) print(qc.draw()) print(pass_(qc).draw())가 이전에는 인쇄되었습니다:
┌─┐┌─┐ q_0: ─X─┤M├┤M├ │ └╥┘└╥┘ q_1: ─X──╫──╫─ ║ ║ c: 1/════╩══╩═ 0 0 ┌─┐ q_0: ┤M├─── └╥┘┌─┐ q_1: ─╫─┤M├ ║ └╥┘ c: 1/═╩══╩═ 0 0이제 두 번째 회로가 올바르게 최적화되었습니다:
q_0: ────── ┌─┐┌─┐ q_1: ┤M├┤M├ └╥┘└╥┘ c: 1/═╩══╩═ 0 0 -
QPY 직렬화 관련 문제를 수정했습니다
QuantumCircuit에 동일한 속성을 가진 여러 사용자 지정 명령어 인스턴스가 포함되어 있는 경우name속성을 가진 커스텀 인스트럭션 인스턴스가 여러 개 있을 때 발생하는 문제를 수정했습니다. 버전 11 이전의 QPY 형식 버전에서는 QPY 페이로드가 이러한 인스턴스를 구분하지 않고 회로에서 첫 번째 인스턴스의 속성만 직렬화했습니다. 사용자 지정 명령의 다른 속성은 다르지만 이름이 같은 경우 잘못된 역직렬화가 발생할 수 있습니다. 이 문제는 QPY 버전 11에서 수정되어 사용자 지정 명령의 각 인스턴스가 개별적으로 직렬화되고 더 이상 이름이 겹치는 잠재적 충돌이 발생하지 않습니다. 수정 #8941. -
함수 관련 문제를 수정했습니다
qpy.dump()함수에서use_symengine플래그가True로 평가되지만 실제로는 부울True이 아닌 진실 객체로 설정된 경우, 생성된 QPY 페이로드가 손상되는 문제를 수정했습니다. 예를 들어use_symengine를HAS_SYMENGINE로 설정하면 이 객체는 부울로 캐스팅할 때True로 평가되지만 실제로는True이 아닙니다. -
문자열 표현의 버그를 수정했습니다
StabilizerState문자열 표현의 버그를 수정합니다. -
버그
convert_to_target()및BackendV2Converter가 예기치 않은 오류를 발생시키는 버그가 해결되었습니다. 이 버그는 변환할 백엔드에 백엔드 속성에 정의가 없는 게이트에 대한 캘리브레이션이 포함되어 있을 때 발생했습니다. 이러한 게이트는 이제 유한한 큐비트 집합에 대한 보정이 보고되는 경우에도 이상적인 오류 없는 명령으로 모든 큐비트에 브로드캐스트됩니다. -
함수 관련 문제를 수정했습니다
circuit_drawer()함수 및QuantumCircuit.draw()메서드 관련 문제를 수정했습니다. -
InstructionDurations.from_backend()는 이제 기본 클래스 대신InstructionDurations의 서브클래스 인스턴스를 반환합니다. -
트랜스파일러 패스는 이제
UnitarySynthesis트랜스파일러 패스는 이제 존재하지 않는 합성 플러그인이 지정되면 런타임까지 기다리지 않고 초기화 시 오류를 생성합니다. 수정 #11355. -
OpenQASM 3개 수출업체
qasm3.dump()와dumps()는 이제 OpenQASM 3 프로젝트에서 버전 관리가 표준화되었으므로 자격이 없는3대신3.0버전이라고 주장하는 파일을 올바르게 출력합니다. -
의 매개변수 형식은
XXPlusYYGate및XXMinusYYGate의 매개변수 형식은 이제get_standard_gate_name_mapping()에서 반환된 매개변수와 초기 로테이션을 올바르게 포함합니다. -
이제
TemplateOptimization패스는 이제 네이티브 심볼릭 표현식 형식인ParameterExpression를 사용하여 파라메트릭 표현식을 반환합니다. 지원되는 대부분의 플랫폼에서 이는 표현식이 Symengine 객체가 된다는 의미입니다. 이전에는 패스가 일치하지 않는 객체를 반환하여 나중에 매개변수 처리 코드에서 오류를 일으킬 수 있었습니다.