Qiskit v1.0 의 기능 변경 사항
이 가이드는 Qiskit v1.0 의 주요 기능 변경 사항에 대한 마이그레이션 경로를 모듈별로 정리하여 설명합니다. 오른쪽에 있는 목차를 이용하여 관심 있는 모듈로 이동하세요.
Qiskit v1.0 마이그레이션 도구
마이그레이션 프로세스를 쉽게 진행하려면 다음을 사용할 수 있습니다 flake8-qiskit-migration 도구를 사용하여 코드에서 제거된 가져오기 경로를 감지하고 대안을 제안할 수 있습니다.
설치되어 있는 경우 pipx 설치되어 있다면 명령을 실행하면 됩니다.
pipx run flake8-qiskit-migration <path-to-source-directory>이렇게 하면 패키지가 임시 가상 환경에 설치되고 코드에서 실행됩니다 실행합니다.
pipx 을 사용하지 않으려면 수동으로 도구에 대한 새 환경을 수동으로 만들 수 있습니다. 이 접근 방식을 사용하면 다음을 사용할 수도 있습니다 nbqa 를 사용하여 코드 예제를 확인할 수도 있습니다 주피터 노트북에서 코드 예제를 확인할 수도 있습니다. 완료되면 환경을 삭제합니다.
# Make new environment and install
python -m venv .flake8-qiskit-migration-venv
source .flake8-qiskit-migration-venv/bin/activate
pip install flake8-qiskit-migration
# Run plugin on Python code
flake8 --select QKT100 <path-to-source-directory> # e.g. `src/`
# (Optional) run plugin on notebooks
pip install nbqa
nbqa flake8 ./**/*.ipynb --select QKT100
# Deactivate and delete environment
deactivate
rm -r .flake8-qiskit-migration-venv이 도구는 제거된 가져오기 경로만 감지합니다. 제거된 메서드 사용은 감지하지 않습니다 메서드(예: QuantumCircuit.qasm) 또는 인수의 사용을 감지하지 못합니다. 또한 다음과 같은 과제는 추적할 수 없습니다 와 같은 별칭은 처리할 수 있지만 qk = qiskit 과 같은 할당은 추적할 수 없습니다 import qiskit as qk.
자세한 내용은 프로젝트의 리포지토리를 참조하세요.
글로벌 인스턴스와 함수
AER
Qiskit v1.0 에서는 해당 qiskit.Aer 객체를 사용할 수 없습니다. 대신,
네임스페이스의 qiskit_aer 동일한 객체를 사용하십시오. 이 객체는 바로 대체할 수 있는 대체품입니다.
qiskit_aer설치하려면 다음 명령을 실행하세요:
pip install qiskit-aerBasicAer
Qiskit v1.0 에서는 해당 qiskit.BasicAer 객체를 사용할 수 없습니다. 마이그레이션 옵션은
여기를
basicaer 이주 관련 섹션참조하십시오.
실행
이 qiskit.execute 함수는 Qiskit v1.0 에서 사용할 수 없습니다. 이
함수는 Qiskit의 및
run함수를
transpile감싸는 고수준 래퍼 역할을 했습니다.
대신 qiskit.execute 함수를
transpile 호출한 뒤에
backend.run()를 사용하세요.
# Legacy path
from qiskit import execute
job = execute(circuit, backend)
# New path
from qiskit import transpile
new_circuit = transpile(circuit, backend)
job = backend.run(new_circuit)또는 샘플러 프리미티브는 의미론적으로 제거된 qiskit.execute 함수와 의미적으로 동일합니다. 클래스 BackendSampler 는 프리미티브를 지원하는 백엔드를 위한 백엔드를 위한 제네릭 래퍼입니다:
from qiskit.primitives import BackendSampler
sampler = BackendSampler(backend)
job = sampler.run(circuit)qiskit.circuit
QuantumCircuit.qasm
QuantumCircuit.qasm 메소드가 제거되었습니다. 대신 다음을 사용하세요 qasm2.dump 또는 qasm2.dumps.
Pygments 형식의 출력의 경우, 독립형 openqasm-pygments 패키지를 확인하세요, qasm2.dump 및 qasm2.dumps 은 Pygments 색상의 출력을 제공하지 않습니다.
from qiskit import QuantumCircuit
qc = QuantumCircuit(1)
# Old
qasm_str = qc.qasm()
# Alternative
from qiskit.qasm2 import dumps
qasm_str = dumps(qc)
# Alternative: Write to file
from qiskit.qasm2 import dump
with open("my_file.qasm", "w") as f:
dump(qc, f)QuantumCircuit 문
다음과 같은 게이트 메서드가 제거되어 더 확립된 메서드가 추가되었습니다:
제거됨 | 대안 |
|---|---|
QuantumCircuit.cnot | QuantumCircuit.cx |
QuantumCircuit.toffoli | QuantumCircuit.ccx |
QuantumCircuit.fredkin | QuantumCircuit.cswap |
QuantumCircuit.mct | QuantumCircuit.mcx |
QuantumCircuit.i | QuantumCircuit.id |
QuantumCircuit.squ | QuantumCircuit.unitary |
다음 회로 방법이 제거되었습니다. 대신, 이러한 게이트는 QuantumCircuit.append를 사용하여 회로에 적용할 수 있습니다.
제거됨 | 대안(추가) |
|---|---|
QuantumCircuit.diagonal | DiagonalGate |
QuantumCircuit.hamiltonian | HamiltonianGate |
QuantumCircuit.isometry | Isometry |
QuantumCircuit.iso | Isometry |
QuantumCircuit.uc | UCGate |
QuantumCircuit.ucrx | UCRXGate |
QuantumCircuit.ucry | UCRYGate |
QuantumCircuit.ucrz | UCRZGate |
예를 들어 DiagonalGate:
from qiskit.circuit import QuantumCircuit
# new location in the circuit library:
from qiskit.circuit.library import DiagonalGate
circuit = QuantumCircuit(2)
circuit.h([0, 1]) # some initial state
gate = DiagonalGate([1, -1, -1, 1])
qubits = [0, 1] # qubit indices on which to apply the gate
circuit.append(gate, qubits) # apply the gate다음 QuantumCircuit 메소드도 제거되었습니다:
제거됨 | 대안 |
|---|---|
QuantumCircuit.bind_parameters | QuantumCircuit.assign_parameters |
QuantumCircuit.snapshot | qiskit-aer의 저장 지침 |
qiskit.converters
qiskit.converters.ast_to_dag 함수가 키스킷에서 제거되었습니다. 이 구문 분석기는 레거시 OpenQASM 2 파서에 의해 생성된 추상 구문 트리를 DAGCircuit. 레거시 OpenQASM 2 구문 분석기가 제거되었으므로 ( qiskit.qasm ), 이 함수는 더 이상 사용되지 않습니다. 대신 OpenQASM 2 파일을 다음과 같이 구문 분석합니다 QuantumCircuit 으로 구문 분석합니다 QuantumCircuit.from_qasm_file 또는 QuantumCircuit.from_qasm_str 생성자 메서드(또는 qiskit.qasm2 모듈), 그런 다음 QuantumCircuit 를 DAGCircuit 와 circuit_to_dag.
# Previous
from qiskit.converters import ast_to_dag
from qiskit.qasm import Qasm
dag = ast_to_dag(Qasm(filename="myfile.qasm").parse())
# Current alternative
import qiskit.qasm2
from qiskit.converters import circuit_to_dag
dag = circuit_to_dag(qiskit.qasm2.load("myfile.qasm"))qiskit.extensions
qiskit.extensions 모듈은 더 이상 사용할 수 없습니다. 대부분의 객체는 회로 라이브러리에 통합되었습니다 (qiskit.circuit.library). 새 위치로 마이그레이션하려면 새 위치로 마이그레이션하려면 개체 가져오기 경로에서 qiskit.extensions 를 qiskit.circuit.library 로 바꾸면 됩니다. 이것은 드롭인 대체품입니다.
# Previous
from qiskit.extensions import DiagonalGate
# Current alternative
from qiskit.circuit.library import DiagonalGate이동된 클래스는 qiskit.circuit.library 로 이동한 클래스입니다:
DiagonalGateHamiltonianGateInitializeIsometryqiskit.circuit.library.generalized_gates.mcg_up_diag.MCGupDiagUCGateUCPauliRotGateUCRXGateUCRYGateUCRZGateUnitaryGate
다음 클래스는 코드베이스에서 제거되었습니다 함수가 중복되거나 extensions 모듈에 연결되었기 때문에 코드베이스에서 제거되었습니다:
제거됨 | 대안 |
|---|---|
SingleQubitUnitary | qiskit.circuit.library.UnitaryGate |
Snapshot | 사용 qiskit-aer 's 저장 지침 |
ExtensionError | 관련 오류 클래스 |
qiskit.primitives
모듈에서 가장 눈에 띄는 변화는 qiskit.primitives 모듈에서 가장 눈에 띄는 변화는 새로운 프리미티브 V2 인터페이스의 도입입니다. 이 섹션에서는 여러분의 워크플로를 V1 에서 V2 으로 마이그레이션하는 방법과 인터페이스에서 허용되는 입력에 대해 V1 에서 허용되는 입력에 대해 설명합니다.
v1.0 릴리스부터는 pre-1.0 의 프리미티브 인터페이스를 “프리미티브 V1 ”라고 부를 예정입니다.
V1 에서 V2 로 이전하기
프리미티브의 공식적인 구분은 V1 와 V2 API가 기본 클래스로서 프리미티브 구현이 상속하는 기본 클래스입니다. 새 기본 클래스로 전환하려면 다음을 유지하면 됩니다 qiskit.primitives에서 원래 가져오기 경로를 유지하면 됩니다:
마이그레이션 소스 | 대체 |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
V2 프리미티브의 키스킷 핵심 구현( qiskit.primitives 에서 가져올 수 있는 것들)의 이름이 수정되었습니다, 는 상태 벡터 시뮬레이터 백엔드로 로컬에서 실행할 수 있는 구현으로서의 목적을 명확히 하기 위해 로컬에서 실행할 수 있는 구현으로 목적을 명확히 하기 위해 수정되었다. 새 이름에는 -V2 접미사가 포함되지 않습니다.
마이그레이션 소스 | 대체 |
|---|---|
qiskit.primitives.Estimator | qiskit.primitives.StatevectorEstimator |
qiskit.primitives.Sampler | qiskit.primitives.StatevectorSampler |
V1 에서 V2 으로 마이그레이션할 때 고려해야 할 몇 가지 개념적 차이점이 있습니다.
이러한 차이점은 베이스 클래스에 의해 결정되지만, 다음 예제에서는 statevector qiskit.primitives에 있는 구현을 사용한 예제입니다:
다음 예제에서는 다음과 같은 임포트와 프리미티브 초기화를 가정합니다:
from qiskit.primitives import (
Sampler,
StatevectorSampler,
Estimator,
StatevectorEstimator,
)
estimator_v1 = Estimator()
sampler_v1 = Sampler()
estimator_v2 = StatevectorEstimator()
sampler_v2 = StatevectorSampler()
# define circuits, observables and parameter valuesSampler and Estimator: 새로운V2기본 요소는 벡터화된 입력을 수용하도록 설계되었으며, 이를 통해 단일 회로를 배열 값 사양과 함께 그룹화할 수 있습니다. 즉, 하나의 회로 실행으로 매개변수 집합,n관측값, 또는 둘n다(Estimator의 경우)의 배열에 대해 처리할 수 있습니다. 각 그룹은 ‘기본 통합 블록(PUB) ’이라고 불리며, 튜플로 표현될 수 있습니다:(1 x circuit, [n x observables], [n x parameters]). V1 인터페이스는 그와 같은 유연성을 제공하지 못했습니다. 대신, 다음 예시에서 볼 수 있듯이 입력 회로의 수는 관측 가능한 변수와 매개변수 집합의 수와 일치해야 했습니다(각 예시를 보려면 탭을 선택하세요):
# executing 1 circuit with 4 observables using Estimator V1
job = estimator_v1.run([circuit] * 4, [obs1, obs2, obs3, obs4])
evs = job.result().values
# executing 1 circuit with 4 observables using Estimator V2
job = estimator_v2.run([(circuit, [obs1, obs2, obs3, obs4])])
evs = job.result()[0].data.evs# executing 1 circuit with 3 parameter sets using Sampler V1
job = sampler_v1.run([circuit] * 3, [vals1, vals2, vals3])
dists = job.result().quasi_dists
# executing 1 circuit with 3 parameter sets using Sampler V2
job = sampler_v2.run([(circuit, [vals1, vals2, vals3])])
counts = job.result()[0].data.meas.get_counts()# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V1
job = estimator_v1.run([circuit] * 8, [obs1, obs2, obs3, obs4] * 2, [vals1, vals2] * 4)
evs = job.result().values
# executing 1 circuit with 4 observables and 2 parameter sets using Estimator V2
job = estimator_v2.run([(circuit, [[obs1, obs2, obs3, obs4]], [[vals1], [vals2]])])
evs = job.result()[0].data.evsV2 프리미티브는 여러 PUB를 입력으로 받아들이고, 각 PUB는 고유한 결과를 가져옵니다. 이 를 사용하면 다양한 매개변수/관찰 가능한 조합으로 다양한 회로를 실행할 수 있습니다, V1 인터페이스에서는 항상 가능하지 않았습니다:
# executing 2 circuits with 1 parameter set using Sampler V1
job = sampler_v1.run([circuit1, circuit2], [vals1] * 2)
dists = job.result().quasi_dists
# executing 2 circuits with 1 parameter set using Sampler V2
job = sampler_v2.run([(circuit1, vals1), (circuit2, vals1)])
counts1 = job.result()[0].data.meas.get_counts() # result for pub 1 (circuit 1)
counts2 = job.result()[1].data.meas.get_counts() # result for pub 2 (circuit 2)# executing 2 circuits with 2 different observables using Estimator V1
job = estimator_v1.run([circuit1, circuit2] , [obs1, obs2])
evs = job.result().values
# executing 2 circuits with 2 different observables using Estimator V2
job = estimator_v2.run([(circuit1, obs1), (circuit2, obs2)])
evs1 = job.result()[0].data.evs # result for pub 1 (circuit 1)
evs2 = job.result()[1].data.evs # result for pub 2 (circuit 2)-
샘플러 : 이제
V2샘플러는 V1 인터페이스에서 제공하던 준확률 분포 대신 비트열 또는 카운트 형태의 측정 결과 샘플을 반환합니다. 이 비트열은 측정 결과를 보여주며, 측정된 순서대로 정렬되어 있습니다. V2 의 샘플러 결과 객체는 동적 회로와의 호환성을 위해 입력 회로의 고전적 레지스터 이름을 기준으로 데이터를 구성합니다.# Define quantum circuit with 2 qubits circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() circuit.draw()┌───┐ ░ ┌─┐ q_0: ┤ H ├──■───░─┤M├─── └───┘┌─┴─┐ ░ └╥┘┌─┐ q_1: ─────┤ X ├─░──╫─┤M├ └───┘ ░ ║ └╥┘ meas: 2/══════════════╩══╩═ 0 1기본 클래식 레지스터 이름위의 회로에서 클래식 레지스터의 이름이
"meas"로 기본 설정되어 있는 것을 확인할 수 있습니다. 이 이름은 나중에 측정 비트스트링에 액세스할 때 사용됩니다.# Run using V1 Sampler result = sampler_v1.run(circuit).result() quasi_dist = result.quasi_dists[0] print(f"The quasi-probability distribution is: {quasi_dist}")The quasi-probability distribution is: {0: 0.5, 3: 0.5}# Run using V2 Sampler result = sampler_v2.run([circuit]).result() # Access result data for pub 0 data_pub = result[0].data # Access bitstrings for the classical register "meas" bitstrings = data_pub.meas.get_bitstrings() print(f"The number of bitstrings is: {len(bitstrings)}") # Get counts for the classical register "meas" counts = data_pub.meas.get_counts() print(f"The counts are: {counts}")The number of bitstrings is: 1024 The counts are: {'00': 523, '11': 501} -
Sampler and Estimator: V1 구현에서 일반적으로 노출되는 샘플링 오버헤드는shots를 통해 일반적으로 노출되는 샘플링 오버헤드는 이제 프리미티브run()메서드의 인수가 됩니다 에서 지정할 수 있는 PUB 수준에서 지정할 수 있습니다. V2 베이스 클래스는 V1 API와는 다른 형식으로 인수를 노출합니다:-
BaseSamplerV2.run는shots인수를 노출합니다(이전 워크플로와 유사):# Sample two circuits at 128 shots each. sampler_v2.run([circuit1, circuit2], shots=128) # Sample two circuits at different amounts of shots. # The "None"s are necessary as placeholders # for the lack of parameter values in this example. sampler_v2.run([(circuit1, None, 123), (circuit2, None, 456)]) -
EstimatorV2.run는precision인수를 도입하여 원시 구현에서 프리미티브 구현이 기대값 추정을 위해 목표로 삼아야 하는 오차 막대를 지정합니다:# Estimate expectation values for two PUBs, both with 0.05 precision. estimator_v2.run([(circuit1, obs_array1), (circuit2, obs_array_2)], precision=0.05 )
-
V1 인터페이스 업데이트
-
밀도가 높은
BaseOperator에서SparsePauliOp에서Estimator관찰 가능한 인수 은 더 이상 허용되지 않습니다. 명시적으로 변환해야 합니다SparsePauliOp로 명시적으로 변환해야 합니다SparsePauliOp.from_operator(operator)를 사용하여 명시적으로 변환해야 합니다. -
를 사용하여
PauliList에 추정기 관찰 가능 인수를 사용하는 것은 더 이상 허용되지 않습니다. 대신 다음을 수행해야 합니다 를 사용하여 인수를 명시적으로 변환해야 합니다SparsePauliOp(pauli_list)를 사용하여 명시적으로 변환해야 합니다.
qiskit.providers
기본에어
qiskit.providers.basicaer 모듈의 대부분의 기능이 새로운 qiskit.providers.basic_provider 모듈로 대체되었지만, UnitarySimulatorPy 과 StatevectorSimulatorPy 클래스는 제거되었습니다; 해당 기능은 이미 모듈에 이미 포함되어 있었습니다 quantum_info 모듈에 이미 포함되어 있었습니다.
새 경로로 마이그레이션하는 방법은 간단합니다. 대부분의 클래스를 qiskit.providers.basicaer 의 qiskit.providers.basic_provider (드롭인 대체)로 대체할 수 있습니다. 다음 클래스에는 새로운 경로와 이름이 있습니다:
제거됨 | 대안 |
|---|---|
qiskit.providers.basicaer | qiskit.providers.basic_provider |
BasicAerProvider | BasicProvider |
BasicAerJob | BasicProviderJob |
QasmSimulatorPy | BasicSimulator |
새 모듈로 마이그레이션할 때 글로벌 인스턴스가 있는지 확인하세요. 대체할 수 있는 qiskit.BasicAer 으로 직접 가져올 수 있는 BasicAer 글로벌 인스턴스를 대체할 수 없습니다. 즉, from qiskit import BasicProvider 는 더 이상 유효한 가져오기가 아닙니다.
대신 공급자 클래스는 해당 하위 모듈에서 가져와서 사용자가 인스턴스화해야 합니다:
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("backend_name")
# Current
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("backend_name")유니타리 및 상태 벡터 시뮬레이터는 다음과 같이 대체할 수 있습니다 다른 quantum_info 클래스로 대체할 수 있습니다. 이것은 드롭인 교체는 아니지만 드롭인 대체는 아니지만 변경 사항은 미미합니다. 다음 마이그레이션을 참조하세요 예제를 참조하세요:
제거됨 | 대안 |
|---|---|
UnitarySimulatorPy | quantum_info.Operator |
StatevectorSimulatorPy | quantum_info.Statevector |
다음 예는 basicaer 시뮬레이터의 마이그레이션 경로를 보여줍니다.
from qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("statevector_simulator")
statevector = backend.run(qc).result().get_statevector()
# Current
qc.remove_final_measurements() # no measurements allowed
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)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("unitary_simulator")
result = backend.run(qc).result()
# Current
qc.remove_final_measurements() # no measurements allowed
from qiskit.quantum_info import Operator
result = Operator(qc).datafrom qiskit import QuantumCircuit
qc = QuantumCircuit(3)
qc.h(0)
qc.h(1)
qc.cx(1, 2)
qc.measure_all()
# Previous
from qiskit import BasicAer
backend = BasicAer.get_backend("qasm_simulator")
result = backend.run(qc).result()
# One current option
from qiskit.providers.basic_provider import BasicProvider
backend = BasicProvider().get_backend("basic_simulator")
result = backend.run(qc).result()
# Another current option is to specify it directly
from qiskit.providers.basic_provider import BasicSimulator
backend = BasicSimulator()
result = backend.run(qc).result()가짜_제공자
대부분의 사용자 대면 qiskit.providers.fake_provider 컴포넌트의 대부분은 qiskit-ibm-runtime Python 패키지로 마이그레이션되었습니다. 여기에는 가짜 공급자 클래스, 모든 디바이스별 가짜 백엔드(예 FakeVigo, FakeNairobiV2, FakeSherbrooke), 가짜 백엔드 베이스 클래스가 포함됩니다. 다음 탭을 클릭하면 영향을 받는 클래스를 확인할 수 있습니다.
- 의 모든 클래스
qiskit.providers.fake_provider.backends fake_provider.fake_backend.FakeBackendfake_provider.fake_backend.FakeBackendV2
fake_provider.FakeProviderfake_provider.FakeProviderForBackendV2fake_provider.FakeProviderFactory
새 경로로 마이그레이션하려면:
-
qiskit-ibm-runtime0.17.1이상을 설치합니다:pip install 'qiskit-ibm-runtime>=0.17.1' -
코드에서
qiskit.providers.fake_provider의 인스턴스를qiskit_ibm_runtime.fake_provider. 예를 들어,# Old from qiskit.providers.fake_provider import FakeProvider backend1 = FakeProvider().get_backend("fake_ourense") from qiskit.providers.fake_provider import FakeSherbrooke backend2 = FakeSherbrooke() # Alternative from qiskit_ibm_runtime.fake_provider import FakeProvider backend1 = FakeProvider().get_backend("fake_ourense") from qiskit_ibm_runtime.fake_provider import FakeSherbrooke backend2 = FakeSherbrooke()
가짜 백엔드 베이스 클래스도 마이그레이션되었지만 가져오기 경로에 약간의 차이가 있습니다:
제거됨 | 대안 |
|---|---|
qiskit.providers.fake_provider.FakeQasmBackend | qiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend |
qiskit.providers.fake_provider.FakePulseBackend | qiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend |
만약 다운스트림 라이브러리의 유닛 테스트를 위해 가짜 백엔드에 의존하고 있고 qiskit-ibm-runtime 종속성과 충돌하는 경우, 새로운 키스킷 네이티브 일반 가짜 백엔드 대안을 찾을 수도 있다.
여기에는 다음 BackendV1 클래스(드롭인 대체)가 포함됩니다:
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
BackendV2 인스턴스를 반환하는 구성 가능한 클래스입니다:
가짜_제공자 (특별 테스트 백엔드)
의 특수 테스트 목적의 가짜 백엔드 클래스는 qiskit.providers.fake_provider 가지고 qiskit_ibm_runtime.fake_provider로 마이그레이션되지 않았습니다. 권장되는 마이그레이션 경로를 사용하는 것이 좋습니다 GenericBackendV2 클래스를 사용하여 유사한 속성을 가진 백엔드를 구성하거나 사용자 정의된 대상을 빌드하는 것입니다.
제거됨 | 대안 |
|---|---|
fake_provider.FakeBackendV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackend5QV2 | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendV2LegacyQubitProps | fake_provider.GenericBackendV2 |
fake_provider.FakeBackendSimple | fake_provider.GenericBackendV2 |
fake_provider.ConfigurableFakeBackend | fake_provider.GenericBackendV2 |
예시: 새로운 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 generates a 5q backend with generic
# properties that serves the same purpose as FakeBackend5QV2
# but will not be identical.기타 이주 팁
-
qiskit.providers.aer에서 가져오기는 더 이상 불가능합니다. 대신qiskit_aer를 가져와서 드롭 인으로 대체합니다. 설치하려면qiskit_aer, 실행합니다:pip install qiskit-aer -
Qiskit v1.0 에서
qiskit.providers.fake_provider백엔드에서 펄스 작업을 실행하는 기능이 제거되었습니다. 이는 Qiskit Aer가 이러한 작업에 대한 시뮬레이션 기능을 제거했기 때문입니다. 저수준 해밀턴 연산 시뮬레이션 작업의 경우, Qiskit Dynamics와 같은 전용 라이브러리를 사용하는 것을 고려해 보십시오.
qiskit.pulse
ParametricPulse
qiskit.pulse.library.parametric_pulses.ParametricPulse 베이스 클래스와 펄스 라이브러리는 다음과 같이 대체되었습니다 qiskit.pulse.SymbolicPulse 및 해당 펄스 라이브러리로 대체되었습니다. SymbolicPulse 지원 QPY 직렬화:
from qiskit import pulse, qpy
with pulse.build() as schedule:
pulse.play(pulse.Gaussian(100, 0.1, 25), pulse.DriveChannel(0))
with open('schedule.qpy', 'wb') as fd:
qpy.dump(schedule, fd)제거됨 | 대안 |
|---|---|
pulse.library.parametric_pulses.ParametricPulse | qiskit.pulse.SymbolicPulse |
pulse.library.parametric_pulses.Constant | pulse.library.symbolic_pulses.Constant |
pulse.library.parametric_pulses.Drag | pulse.library.symbolic_pulses.Drag |
pulse.library.parametric_pulses.Gaussian | pulse.library.symbolic_pulses.Gaussian |
qiskit.pulse.library.parametric_pulses.GaussianSquare | pulse.library.symbolic_pulses.GaussianSquare |
복소수 진폭
복소수 값 펄스 진폭(amp)은 (amp, angle) 듀오로 대체됩니다. 이 표현은 특히 각도 보정과 같은 일부 보정 작업에 더 직관적입니다:
from qiskit import pulse
from qiskit.circuit import Parameter
from math import pi
with pulse.build() as schedule:
angle = Parameter("θ")
pulse.play(pulse.Gaussian(100, 0.1, 25, angle=angle), pulse.DriveChannel(0))
schedule.assign_parameters({angle: pi})회로 게이트 동작 주입
다음을 통해 펄스 빌더 컨텍스트에 회로 게이트 연산을 주입합니다 qiskit.pulse.builder.call 를 통한 회로 게이트 연산 주입은 더 이상 불가능합니다.
이 제거는 QuantumCircuit 유형의 입력 인자뿐만 아니라 함수에 영향을 줍니다:
qiskit.pulse.builder.call_gateqiskit.pulse.builder.cxqiskit.pulse.builder.u1qiskit.pulse.builder.u2qiskit.pulse.builder.u3qiskit.pulse.builder.x
그래도 백엔드에서 보정된 스케줄을 삽입하려면 게이트 명령을 호출하는 대신 다음 패턴을 사용하세요.
from qiskit.providers.fake_provider import GenericBackendV2
from qiskit import pulse
backend = GenericBackendV2(num_qubits=5)
sched = backend.target["x"][(qubit,)].calibration
with pulse.build() as only_pulse_scheds:
pulse.call(sched)마찬가지로 QuantumCircuit can 를 수동으로 트랜스파일링하고 스케줄링하여 빌더 컨텍스트에 주입할 수 있습니다 객체를 삽입할 수 있습니다.
from math import pi
from qiskit.compiler import schedule, transpile
qc = QuantumCircuit(2)
qc.rz(pi / 2, 0)
qc.sx(0)
qc.rz(pi / 2, 0)
qc.cx(0, 1)
qc_t = transpile(qc, backend)
sched = schedule(qc_t, backend)
with pulse.build() as only_pulse_scheds:
pulse.call(sched)빌더를 사용하여 최소 펄스 프로그램을 작성하고 이를 QuantumCircuit 를 통해 QuantumCircuit.add_calibration 메서드를 통해 게이트 명령의 마이크로코드로 첨부하는 것이 좋습니다 프로그램을 작성하는 것이 좋습니다.
builder.build
qiskit.pulse.builder.build 에서 다음 인수가 제거되었습니다 대안이 없습니다.
default_transpiler_settingsdefault_circuit_scheduler_settings
이러한 기능도 제거되었습니다:
qiskit.pulse.builder.active_transpiler_settingsqiskit.pulse.builder.active_circuit_scheduler_settingsqiskit.pulse.builder.transpiler_settingsqiskit.pulse.builder.circuit_scheduler_settings
이는 더 이상 회로 객체를 빌더 컨텍스트에 빌더 컨텍스트( 회로 게이트 주입하기 작업 참조); 이러한 설정은 주입된 객체를 펄스 표현으로 변환하기 위한 설정이었습니다.
라이브러리
개별 펄스 라이브러리가 코드 베이스에서 제거되었습니다. 여기에는 다음과 같은 혜택이 포함됩니다.
qiskit.pulse.library.constantqiskit.pulse.library.zeroqiskit.pulse.library.squareqiskit.pulse.library.sawtoothqiskit.pulse.library.triangleqiskit.pulse.library.cosqiskit.pulse.library.sinqiskit.pulse.library.gaussianqiskit.pulse.library.gaussian_derivqiskit.pulse.library.sechqiskit.pulse.library.sech_derivqiskit.pulse.library.gaussian_squareqiskit.pulse.library.drag
대신 해당 qiskit.pulse.SymbolicPulse, 와 함께 SymbolicPulse.get_waveform().
예를 들어 pulse.gaussian(100,0.5,10) 대신 pulse.Gaussian(100,0.5,10).get_waveform(). 두 단계 모두 Sawtooth 와 Square 의 위상은 다음과 같이 정의됩니다 2\pi 의 위상은 이산형 위상과는 반대로 전체 주기만큼 이동합니다 의 위상이 전체 주기로 이동하도록 정의됩니다. 또한 복잡한 진폭은 더 이상 심볼 펄스 라이브러리에서 지원되지 않습니다 대신 float, amp, angle 을 사용하세요.
ScalableSymbolicPulse
더 이상 라이브러리 qiskit.pulse.ScalableSymbolicPulse 복잡한 amp 매개변수가 있는 객체를 버전 5 이하 qpy 파일에서 로드할 수 없습니다 (키스킷 테라 < 0.23.0 ). 복잡한 amp 은 다음과 같이 자동으로 변환되므로 마이그레이션 작업이 필요하지 않습니다 float (amp, angle)로 자동 변환되므로 별도의 마이그레이션 작업이 필요하지 않습니다.
이 변경 사항은 이러한 펄스에 적용됩니다:
qiskit.qasm
이전에 qiskit.qasm 에 있던 레거시 OpenQASM 2 파서 모듈은 으로 대체되었습니다 qiskit.qasm2 모듈로 대체되었습니다 모듈로 대체되어 OpenQASM 2에 더 빠르고 정확한 파서를 제공합니다. 높은 수준의 QuantumCircuit 메서드 from_qasm_file() 및 from_qasm_str() 는 동일하게 유지되지만 내부적으로 새 구문 분석기를 사용합니다. 그러나 공개 qasm2 모듈의 인터페이스는 동일하지 않습니다. 모듈은 qiskit.qasm 모듈은 구문 분석기 라이브러리에서 반환하는 추상 구문 트리에 대한 인터페이스를 제공했지만 ply 구문 분석기 라이브러리에서 반환하는 추상 구문 트리에 대한 인터페이스를 제공하지만, qiskit.qasm2 은 AST 또는 구문 분석기에 대한 하위 수준의 구문 분석기에 대한 구현 세부 정보를 노출하지 않습니다. 대신 OpenQASM 2 입력과 출력하는 QuantumCircuit 객체를 출력합니다.
예를 들어 이전에 이와 같은 작업을 실행하고 있었다면요:
import qiskit.qasm
from qiskit.converters import ast_to_dag, dag_to_circuit
ast = qiskit.qasm.Qasm(filename="myfile.qasm").parse()
dag = ast_to_dag(ast)
qasm_circ = dag_to_circuit(dag)다음으로 변경하십시오.
import qiskit.qasm2
qasm_circ = qiskit.qasm2.load("myfile.qasm")qiskit.quantum_info
qiskit.quantum_info.synthesis 모듈은 코드베이스의 여러 위치로 마이그레이션되었습니다 주로 코드베이스의 qiskit.synthesis.
제거됨 | 대안 |
|---|---|
OneQubitEulerDecomposer | qiskit.synthesis.one_qubit.OneQubitEulerDecomposer |
TwoQubitBasisDecomposer | qiskit.synthesis.two_qubits.TwoQubitBasisDecomposer |
XXDecomposer | qiskit.synthesis.two_qubits.XXDecomposer |
two_qubit_cnot_decompose | qiskit.synthesis.two_qubits.two_qubit_cnot_decompose |
Quaternion | qiskit.quantum_info.Quaternion |
이 이동은 Quaternion 의 일반적인 가져오기 경로에는 영향을 미치지 않지만 더 이상 를 통해 qiskit.quantum_info.synthesis를 통해 액세스할 수 없습니다.
마지막으로 cnot_rxx_decompose 이 삭제되었습니다.
qiskit.test
qiskit.test 모듈은 더 이상 공개 모듈이 아닙니다. 이것은 결코 공개할 의도가 없었습니다, 키스킷 테스트 스위트 외부에서 사용하기 위한 것이 아닙니다. 모든 기능은 키스킷에 한정되어 있으며, 유사한 기능이 필요하다면 대안이 제공되지 않는다; 유사한 기능이 필요하다면, 자체 테스트 하네스에 포함시켜야 한다 테스트 하네스에 포함시켜야 한다.
qiskit.tools
이 qiskit.tools 모듈은 Qiskit v1.0 에서 제거되었습니다. 이 기능의 대부분은
다른 패키지의 유사한 기능으로 대체되었거나, 대체 방안 없이 제거되었습니다.
가장 큰 예외는 함수로 qiskit.tools.parallel_map() , 이 함수는
모듈로 qiskit.utils 옮겨졌습니다. 대신
이 새로운 위치에서 사용할 수 있습니다. 예를 들어,
이전에 실행 중이었다면
# Previous
from qiskit.tools import parallel_map
parallel_map(func, input)
# Current
from qiskit.utils import parallel_map
parallel_map(func, input)jupyter
qiskit.tools.jupyter 하위 모듈이 제거된 이유는 이 모듈의 기능이 이 모듈의 기능이 더 이상 지원되지 않는 레거시 qiskit-ibmq-provider 패키지에 연결되어 있기 때문에 더 이상 지원되지 않습니다. 또한 최신 버전이 아닌 BackendV1 만 지원했습니다 BackendV2 인터페이스만 지원합니다.
모니터
qiskit.tools.monitor 서브모듈은 더 이상 지원되지 않는 더 이상 지원되지 않는 레거시 qiskit-ibmq-provider 패키지에 연결되어 있기 때문에 제거되었습니다 (또한 BackendV1 인터페이스만 지원하며 최신 BackendV2 인터페이스도 지원하지 않습니다). 있습니다 이 기능에 대한 대안이 제공되지 않습니다.
시각화
qiskit.tools.visualization 서브모듈이 제거되었습니다. 이 모듈은 키스킷 시각화 모듈의 키스킷 시각화 모듈의 원래 위치에서 레거시 리디렉션되었으며 로 이동되었으며 qiskit.visualization 키스킷의 0.8.0. 이 경로를 계속 사용 중이라면 가져오기 경로를 qiskit.tools.visualization 에서 qiskit.visualization.
# Previous
from qiskit.tools.visualization import plot_histogram
plot_histogram(counts)
# Current
from qiskit.visualization import plot_histogram
plot_histogram(counts)이벤트
qiskit.tools.events 모듈과 이 모듈에 노출된 progressbar() 유틸리티가 가 제거되었습니다. 이 모듈의 기능은 널리 사용되지 않았으며 다음과 같은 전용 패키지로 더 잘 지원됩니다 tqdm.
qiskit.transpiler
합성
qiskit.transpiler.synthesis 모듈의 항목이 새 위치로 마이그레이션되었습니다:
제거됨 | 대안 |
|---|---|
qiskit.transpiler.synthesis.aqc ( AQCSynthesisPlugin) | qiskit.synthesis.unitary.aqc |
qiskit.transpiler.synthesis.graysynth | qiskit.synthesis.synth_cnot_phase_aam |
qiskit.transpiler.synthesis.cnot_synth | qiskit.synthesis.synth_cnot_count_full_pmh |
패스
NoiseAdaptiveLayout 트랜스파일러 패스는 다음과 같이 대체되었습니다 VF2Layout 및 VF2PostLayout, 로 대체되었으며, 이는 보고된 노이즈 특성을 기반으로 레이아웃을 설정하는 백엔드. 패스와 해당 "noise_adaptive" 레이아웃 단계 플러그인이 키스킷에서 제거되었습니다.
CrosstalkAdaptiveSchedule 트랜스파일러 패스가 코드 베이스에서 제거되었습니다 코드 베이스에서 제거되었습니다. 이 패스는 더 이상 사용할 수 없는데, 내부 작동이 이 BackendProperties 페이로드에 설정된 사용자 정의 속성에 의존했기 때문에 더 이상 사용할 수 없습니다 BackendV1 에 설정된 사용자 정의 속성에 의존했기 때문입니다. 이러한 필드를 설정하는 백엔드가 없으므로 패스가 제거되었습니다 가 제거되었습니다.
패스매니저
append 메소드의 ConditionalController, FlowControllerLinear및 DoWhileController 클래스 가 제거되었습니다. 대신, 모든 작업은 컨트롤러 객체가 생성될 때 제공해야 합니다.
qiskit.utils
qiskit.utils 의 다음 도구는 대체되지 않고 제거되었습니다:
qiskit.utils.arithmeticqiskit.utils.circuit_utilsqiskit.utils.entangler_mapqiskit.utils.name_unnamed_args
이러한 기능은 qiskit.algorithms 및 qiskit.opflow 모듈에서만 사용되었으나 제거되었습니다.
qiskit.visualization
qiskit.visualization.qcstyle 모듈이 제거되었습니다. 사용 qiskit.visualization.circuit.qcstyle 를 직접 대체합니다.