주 콘텐츠로 건너뛰기

Qiskit 1.0 기능 변경 사항

이 가이드는 Qiskit 1.0의 가장 중요한 기능 변경 사항에 대한 마이그레이션 경로를 모듈별로 설명합니다. 오른쪽의 목차를 사용하여 관심 있는 모듈로 이동하세요.

Qiskit 1.0 마이그레이션 도구

마이그레이션 과정을 쉽게 하기 위해, flake8-qiskit-migration 도구를 사용하여 코드에서 제거된 임포트 경로를 감지하고 대안을 제안받을 수 있습니다.

pipx가 설치되어 있다면, 다음 명령어를 실행하세요.

pipx run flake8-qiskit-migration <path-to-source-directory>

패키지가 임시 가상 환경에 설치되고 코드에 대해 실행됩니다.

제한 사항

이 도구는 제거된 임포트 경로만 감지합니다. 제거된 메서드(예: QuantumCircuit.qasm)나 인수의 사용은 감지하지 않습니다. 또한 qk = qiskit과 같은 할당을 추적할 수 없지만, import qiskit as qk과 같은 별칭은 처리할 수 있습니다.

자세한 내용은 프로젝트 리포지토리를 참조하세요.

전역 인스턴스 및 함수

Aer

qiskit.Aer 객체는 Qiskit 1.0에서 사용할 수 없습니다. 대신, 드롭인 대체인 qiskit_aer 네임스페이스의 동일한 객체를 사용하세요. qiskit_aer를 설치하려면 다음을 실행하세요:

pip install qiskit-aer

BasicAer

qiskit.BasicAer 객체는 Qiskit 1.0에서 사용할 수 없습니다. 마이그레이션 옵션은 basicaer 마이그레이션 섹션을 참조하세요.

execute

qiskit.execute 함수는 Qiskit 1.0에서 사용할 수 없습니다. 이 함수는 Qiskit의 transpilerun 함수에 대한 고수준 래퍼 역할을 했습니다. 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)

또는, Sampler 프리미티브가 제거된 qiskit.execute 함수와 의미적으로 동일합니다. BackendSampler 클래스는 프리미티브를 지원하지 않는 Backend를 위한 범용 래퍼입니다:

from qiskit.primitives import BackendSampler

sampler = BackendSampler(backend)
job = sampler.run(circuit)

qiskit.circuit

QuantumCircuit.qasm

QuantumCircuit.qasm 메서드가 제거되었습니다. 대신, qasm2.dump 또는 qasm2.dumps를 사용하세요.

Pygments 형식의 출력을 원한다면, qasm2.dumpqasm2.dumps는 Pygments 색상 출력을 제공하지 않으므로 독립형 openqasm-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 Gate

다음 Gate 메서드가 제거되었으며, 동일한 Gate를 추가하는 더 확립된 메서드로 대체되었습니다:

제거됨대안
QuantumCircuit.cnotQuantumCircuit.cx
QuantumCircuit.toffoliQuantumCircuit.ccx
QuantumCircuit.fredkinQuantumCircuit.cswap
QuantumCircuit.mctQuantumCircuit.mcx
QuantumCircuit.iQuantumCircuit.id
QuantumCircuit.squQuantumCircuit.unitary

다음 Circuit 메서드가 제거되었습니다. 대신, 이러한 Gate는 QuantumCircuit.append로 Circuit에 적용할 수 있습니다.

제거됨대안 (append)
QuantumCircuit.diagonalDiagonalGate
QuantumCircuit.hamiltonianHamiltonianGate
QuantumCircuit.isometryIsometry
QuantumCircuit.isoIsometry
QuantumCircuit.ucUCGate
QuantumCircuit.ucrxUCRXGate
QuantumCircuit.ucryUCRYGate
QuantumCircuit.ucrzUCRZGate

예를 들어, DiagonalGate의 경우:

from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import DiagonalGate # new location in the circuit library

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_parametersQuantumCircuit.assign_parameters
QuantumCircuit.snapshotqiskit-aer's save instructions

qiskit.converters

qiskit.converters.ast_to_dag 함수가 Qiskit에서 제거되었습니다. 이 함수는 레거시 OpenQASM 2 파서가 생성한 추상 구문 트리를 DAGCircuit로 변환했습니다. 레거시 OpenQASM 2 파서가 제거되었으므로(qiskit.qasm 참조), 이 함수는 더 이상 용도가 없습니다. 대신, QuantumCircuit.from_qasm_file 또는 QuantumCircuit.from_qasm_str 생성자 메서드(또는 qiskit.qasm2 모듈)를 사용하여 OpenQASM 2 파일을 QuantumCircuit로 파싱한 다음, 해당 QuantumCircuitcircuit_to_dagDAGCircuit로 변환하세요.

# 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 모듈은 더 이상 사용할 수 없습니다. 대부분의 객체가 Circuit 라이브러리 (qiskit.circuit.library)에 통합되었습니다. 새 위치로 마이그레이션하려면, 객체 임포트 경로에서 qiskit.extensionsqiskit.circuit.library로 바꾸면 됩니다. 드롭인 대체입니다.

# Previous
from qiskit.extensions import DiagonalGate

# Current alternative
from qiskit.circuit.library import DiagonalGate

qiskit.circuit.library로 이동한 클래스는 다음과 같습니다:

다음 클래스는 코드베이스에서 제거되었으며, 해당 기능이 중복되었거나 extensions 모듈에 연결되어 있었습니다:

제거됨대안
SingleQubitUnitaryqiskit.circuit.library.UnitaryGate
SnapshotUse qiskit-aer's save instructions
ExtensionErrorA relevant error class

qiskit.primitives

qiskit.primitives 모듈에서 가장 주목할만한 변경 사항은 새로운 프리미티브 V2 인터페이스의 도입입니다. 이 섹션에서는 프리미티브 V1에서 V2로의 워크플로우 마이그레이션 방법과 V1 인터페이스에서 허용되는 입력의 변경 사항을 설명합니다.

참고

1.0 릴리스부터 1.0 이전의 프리미티브 인터페이스를 "프리미티브 V1"이라고 합니다.

V1에서 V2로 마이그레이션

프리미티브 V1과 V2 API의 공식적인 차이점은 프리미티브 구현이 상속하는 기본 클래스입니다. 새 기본 클래스로 전환하려면, qiskit.primitives에서 기존 임포트 경로를 유지할 수 있습니다:

마이그레이션 대상대체 항목
BaseEstimatorBaseEstimatorV2
BaseSamplerBaseSamplerV2

V2 프리미티브의 qiskit 코어 구현 이름(qiskit.primitives에서 임포트 가능)이 statevector 시뮬레이터 Backend로 로컬에서 실행할 수 있는 구현으로서의 목적을 명확히 하기 위해 수정되었습니다. 새 이름에는 -V2 접미사가 포함되지 않습니다.

마이그레이션 대상대체 항목
qiskit.primitives.Estimatorqiskit.primitives.StatevectorEstimator
qiskit.primitives.Samplerqiskit.primitives.StatevectorSampler

V1에서 V2로 마이그레이션할 때 고려해야 할 몇 가지 개념적 차이점이 있습니다. 이러한 차이점은 기본 클래스에 의해 결정되지만, 다음 예제에서는 qiskit.primitives에 있는 statevector 구현을 사용하여 보여줍니다:

참고

다음 예제에서는 다음 임포트 및 프리미티브 초기화를 가정합니다:

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 values
  1. Sampler 및 Estimator: 새로운 V2 프리미티브는 벡터화된 입력을 받도록 설계되어, 단일 Circuit을 배열 값 사양과 그룹화할 수 있습니다. 즉, 하나의 Circuit을 n개의 매개변수 세트, n개의 옵저버블, 또는 둘 다(Estimator의 경우)의 배열에 대해 실행할 수 있습니다. 각 그룹을 **프리미티브 통합 블록(PUB)**이라 하며, 튜플로 표현할 수 있습니다: (1 x circuit, [n x observables], [n x parameters]). V1 인터페이스는 동일한 유연성을 허용하지 않았습니다. 대신, 입력 Circuit의 수가 옵저버블 및 매개변수 세트의 수와 일치해야 했습니다. 다음 예제를 참조하세요(탭을 선택하여 각 예제를 확인하세요):
# 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

V2 프리미티브는 여러 PUB를 입력으로 받으며, 각 PUB는 자체 결과를 얻습니다. 이를 통해 다양한 매개변수/옵저버블 조합으로 서로 다른 Circuit을 실행할 수 있으며, 이는 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)
  1. Sampler: V2 Sampler는 이제 V1 인터페이스의 유사 확률 분포 대신 비트문자열 또는 카운트 형태의 측정 결과 샘플을 반환합니다. 비트문자열은 측정된 순서를 보존하며 측정 결과를 보여줍니다. V2 Sampler 결과 객체는 동적 Circuit과의 호환성을 위해 입력 Circuit의 고전 레지스터 이름에 따라 데이터를 구성합니다.

    # 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
    기본 고전 레지스터 이름

    위 Circuit에서 고전 레지스터의 이름이 기본적으로 "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}
  2. Sampler 및 Estimator: V1 구현에서 shots 실행 옵션을 통해 일반적으로 노출되던 샘플링 오버헤드가 이제 PUB 수준에서 지정할 수 있는 프리미티브 run() 메서드의 인수입니다. V2 기본 클래스는 V1 API와 다른 형식으로 인수를 노출합니다:

    • BaseSamplerV2.runshots 인수를 노출합니다(이전 워크플로우와 유사):

      # 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 인터페이스 업데이트

  • Estimator 옵저버블 인수에서 밀집 BaseOperator에서 SparsePauliOp으로의 암묵적 변환이 더 이상 허용되지 않습니다. 대신 SparsePauliOp.from_operator(operator)를 사용하여 명시적으로 SparsePauliOp으로 변환해야 합니다.

  • Estimator 옵저버블 인수에서 PauliList를 사용하는 것이 더 이상 허용되지 않습니다. 대신 먼저 SparsePauliOp(pauli_list)를 사용하여 인수를 명시적으로 변환해야 합니다.

qiskit.providers

basicaer

qiskit.providers.basicaer 모듈의 대부분 기능이 새로운 qiskit.providers.basic_provider 모듈로 대체되었습니다. 단, UnitarySimulatorPyStatevectorSimulatorPy 클래스는 제거되었으며, 해당 기능은 이미 quantum_info 모듈에 포함되어 있었습니다.

새 경로로의 마이그레이션은 간단합니다. qiskit.providers.basicaer의 대부분 클래스를 qiskit.providers.basic_provider 대응 항목으로 바꿀 수 있습니다(드롭인 대체). 다음 클래스는 새 경로와 이름을 가집니다:

제거됨대안
qiskit.providers.basicaerqiskit.providers.basic_provider
BasicAerProviderBasicProvider
BasicAerJobBasicProviderJob
QasmSimulatorPyBasicSimulator
전역 인스턴스

새 모듈로 마이그레이션할 때 전역 인스턴스에 주의하세요. 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 클래스로 대체할 수 있습니다. 드롭인 대체는 아니지만 변경 사항은 최소한입니다. 다음 마이그레이션 예제를 참조하세요:

제거됨대안
UnitarySimulatorPyquantum_info.Operator
StatevectorSimulatorPyquantum_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)

fake_provider

사용자 대상 qiskit.providers.fake_provider 컴포넌트의 대부분이 qiskit-ibm-runtime Python 패키지로 마이그레이션되었습니다. 여기에는 페이크 프로바이더 클래스, 모든 디바이스별 페이크 Backend(예: FakeVigo, FakeNairobiV2, FakeSherbrooke), 페이크 Backend 기본 클래스가 포함됩니다. 다음 탭을 클릭하여 영향을 받는 클래스를 확인하세요.

  • Any class in qiskit.providers.fake_provider.backends
  • fake_provider.fake_backend.FakeBackend
  • fake_provider.fake_backend.FakeBackendV2

새 경로로 마이그레이션하려면:

  1. qiskit-ibm-runtime 0.17.1 이상을 설치하세요:

    pip install 'qiskit-ibm-runtime>=0.17.1'
  2. 코드에서 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()

페이크 Backend 기본 클래스도 마이그레이션되었지만, 임포트 경로에 몇 가지 차이가 있습니다:

제거됨대안
qiskit.providers.fake_provider.FakeQasmBackendqiskit_ibm_runtime.fake_provider.fake_qasm_backend.FakeQasmBackend
qiskit.providers.fake_provider.FakePulseBackendqiskit_ibm_runtime.fake_provider.fake_pulse_backend.FakePulseBackend
참고

다운스트림 라이브러리의 단위 테스트를 위해 페이크 Backend에 의존하고 있으며 qiskit-ibm-runtime 의존성과 충돌이 있는 경우, 새로운 Qiskit 네이티브 범용 페이크 Backend 대안도 찾을 수 있습니다. 여기에는 다음 BackendV1 클래스(드롭인 대체)가 포함됩니다:

BackendV2 인스턴스를 반환하는 설정 가능한 클래스입니다:

fake_provider (특수 테스트 Backend)

qiskit.providers.fake_provider의 특수 테스트 목적 페이크 Backend 클래스는 qiskit_ibm_runtime.fake_provider로 마이그레이션되지 않았습니다. 권장 마이그레이션 경로는 새로운 GenericBackendV2 클래스를 사용하여 유사한 속성을 가진 Backend를 구성하거나 커스텀 타겟을 빌드하는 것입니다.

제거됨대안
fake_provider.FakeBackendV2fake_provider.GenericBackendV2
fake_provider.FakeBackend5QV2fake_provider.GenericBackendV2
fake_provider.FakeBackendV2LegacyQubitPropsfake_provider.GenericBackendV2
fake_provider.FakeBackendSimplefake_provider.GenericBackendV2
fake_provider.ConfigurableFakeBackendfake_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.providers.fake_provider의 Backend에서 펄스 작업 실행 지원이 Qiskit 1.0에서 제거되었습니다. 이는 Qiskit Aer가 이러한 작업에 대한 시뮬레이션 기능을 제거했기 때문입니다. 저수준 해밀토니안 시뮬레이션 워크로드의 경우, Qiskit Dynamics와 같은 전문 라이브러리 사용을 고려하세요.

qiskit.pulse

ParametricPulse

qiskit.pulse.library.parametric_pulses.ParametricPulse 기본 클래스와 펄스 라이브러리가 qiskit.pulse.SymbolicPulse 및 해당 펄스 라이브러리로 대체되었습니다. SymbolicPulseQPY 직렬화를 지원합니다:

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.ParametricPulseqiskit.pulse.SymbolicPulse
pulse.library.parametric_pulses.Constantpulse.library.symbolic_pulses.Constant
pulse.library.parametric_pulses.Dragpulse.library.symbolic_pulses.Drag
pulse.library.parametric_pulses.Gaussianpulse.library.symbolic_pulses.Gaussian
qiskit.pulse.library.parametric_pulses.GaussianSquarepulse.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})

Circuit Gate 연산 삽입

qiskit.pulse.builder.call을 통해 펄스 빌더 컨텍스트에 Circuit Gate 연산을 삽입하는 것이 더 이상 불가능합니다. 이 제거는 QuantumCircuit 유형의 입력 인수와 다음 함수에 영향을 줍니다:

  • qiskit.pulse.builder.call_gate
  • qiskit.pulse.builder.cx
  • qiskit.pulse.builder.u1
  • qiskit.pulse.builder.u2
  • qiskit.pulse.builder.u3
  • qiskit.pulse.builder.x

여전히 Backend 캘리브레이션된 스케줄을 삽입하려면, Gate 명령어를 호출하는 대신 다음 패턴을 사용하세요.

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는 객체를 수동으로 트랜스파일하고 스케줄링하여 빌더 컨텍스트에 삽입할 수 있습니다.

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.add_calibration 메서드를 통해 Gate 명령어의 마이크로코드로 QuantumCircuit에 첨부하는 것을 권장합니다.

builder.build

qiskit.pulse.builder.build의 다음 인수가 대안 없이 제거되었습니다.

  • default_transpiler_settings
  • default_circuit_scheduler_settings

다음 함수도 제거되었습니다:

  • qiskit.pulse.builder.active_transpiler_settings
  • qiskit.pulse.builder.active_circuit_scheduler_settings
  • qiskit.pulse.builder.transpiler_settings
  • qiskit.pulse.builder.circuit_scheduler_settings

이는 빌더 컨텍스트에 Circuit 객체를 삽입하는 것이 더 이상 불가능하기 때문입니다 (Circuit Gate 연산 삽입 참조). 이러한 설정은 삽입된 객체를 펄스 표현으로 변환하기 위한 것이었습니다.

library

이산 펄스 라이브러리가 코드베이스에서 제거되었습니다. 여기에는 다음이 포함됩니다:

  • qiskit.pulse.library.constant
  • qiskit.pulse.library.zero
  • qiskit.pulse.library.square
  • qiskit.pulse.library.sawtooth
  • qiskit.pulse.library.triangle
  • qiskit.pulse.library.cos
  • qiskit.pulse.library.sin
  • qiskit.pulse.library.gaussian
  • qiskit.pulse.library.gaussian_deriv
  • qiskit.pulse.library.sech
  • qiskit.pulse.library.sech_deriv
  • qiskit.pulse.library.gaussian_square
  • qiskit.pulse.library.drag

대신, 해당하는 qiskit.pulse.SymbolicPulseSymbolicPulse.get_waveform()과 함께 사용하세요. 예를 들어, pulse.gaussian(100,0.5,10) 대신 pulse.Gaussian(100,0.5,10).get_waveform()을 사용하세요. SawtoothSquare의 위상은 이산 대응 항목과 달리 2\\pi의 위상이 전체 사이클을 이동하도록 정의됩니다. 또한 심볼릭 펄스 라이브러리에서 복소 진폭은 더 이상 지원되지 않습니다. 대신 float, amp, angle을 사용하세요.

ScalableSymbolicPulse

버전 5 이하의 qpy 파일(Qiskit Terra < 0.23.0)에서 복소 amp 매개변수가 있는 라이브러리 qiskit.pulse.ScalableSymbolicPulse 객체를 로드하는 것이 더 이상 불가능합니다. 복소 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로 이동했습니다.

제거됨대안
OneQubitEulerDecomposerqiskit.synthesis.one_qubit.OneQubitEulerDecomposer
TwoQubitBasisDecomposerqiskit.synthesis.two_qubits.TwoQubitBasisDecomposer
XXDecomposerqiskit.synthesis.two_qubits.XXDecomposer
two_qubit_cnot_decomposeqiskit.synthesis.two_qubits.two_qubit_cnot_decompose
Quaternionqiskit.quantum_info.Quaternion

이 이동은 Quaternion의 일반적인 임포트 경로에 영향을 주지 않았지만, 더 이상 qiskit.quantum_info.synthesis를 통해 접근할 수 없습니다.

마지막으로, cnot_rxx_decompose가 제거되었습니다.

qiskit.test

qiskit.test 모듈은 더 이상 공개 모듈이 아닙니다. 이 모듈은 공개되거나 Qiskit 테스트 스위트 외부에서 사용되도록 의도된 적이 없었습니다. 모든 기능이 Qiskit에 특화되어 있으며 대안이 제공되지 않습니다. 유사한 기능이 필요한 경우, 자체 테스트 하네스에 포함해야 합니다.

qiskit.tools

qiskit.tools 모듈은 Qiskit 1.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 인터페이스는 지원하지 않았습니다.

monitor

qiskit.tools.monitor 서브모듈이 제거되었습니다. 이는 더 이상 지원되지 않는 레거시 qiskit-ibmq-provider 패키지에 연결되어 있었기 때문입니다(BackendV1 인터페이스만 지원하고 최신 BackendV2 인터페이스는 지원하지 않았습니다). 이 기능에 대한 대안은 제공되지 않습니다.

visualization

qiskit.tools.visualization 서브모듈이 제거되었습니다. 이 모듈은 Qiskit 시각화 모듈의 원래 위치에서의 레거시 리다이렉트였으며, Qiskit 0.8.0에서 qiskit.visualization으로 이동되었습니다. 이 경로를 여전히 사용하고 있다면, 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)

events

qiskit.tools.events 모듈과 이 모듈이 노출하던 progressbar() 유틸리티가 제거되었습니다. 이 모듈의 기능은 널리 사용되지 않았으며, tqdm과 같은 전용 패키지로 더 잘 대체됩니다.

qiskit.transpiler

synthesis

qiskit.transpiler.synthesis 모듈의 항목이 새 위치로 마이그레이션되었습니다:

제거됨대안
qiskit.transpiler.synthesis.aqc (except for AQCSynthesisPlugin)qiskit.synthesis.unitary.aqc
qiskit.transpiler.synthesis.graysynthqiskit.synthesis.synth_cnot_phase_aam
qiskit.transpiler.synthesis.cnot_synthqiskit.synthesis.synth_cnot_count_full_pmh

passes

NoiseAdaptiveLayout Transpiler 패스가 VF2LayoutVF2PostLayout로 대체되었으며, 이는 Backend의 보고된 노이즈 특성을 기반으로 레이아웃을 설정합니다. 패스와 해당 "noise_adaptive" 레이아웃 스테이지 플러그인이 모두 Qiskit에서 제거되었습니다.

CrosstalkAdaptiveSchedule Transpiler 패스가 코드베이스에서 제거되었습니다. 이 패스의 내부 동작이 BackendV1 인스턴스의 BackendProperties 페이로드에 설정된 사용자 정의 속성에 의존했기 때문에 더 이상 사용할 수 없었습니다. 이러한 필드를 설정하는 Backend가 없으므로 패스가 제거되었습니다.

passmanager

ConditionalController, FlowControllerLinear, 및 DoWhileController 클래스의 append 메서드가 제거되었습니다. 대신, 컨트롤러 객체가 생성될 때 모든 작업이 제공되어야 합니다.

qiskit.utils

qiskit.utils의 다음 도구가 대체 없이 제거되었습니다:

  • qiskit.utils.arithmetic
  • qiskit.utils.circuit_utils
  • qiskit.utils.entangler_map
  • qiskit.utils.name_unnamed_args

이러한 함수는 역시 제거된 qiskit.algorithmsqiskit.opflow 모듈에서만 사용되었습니다.

qiskit.visualization

qiskit.visualization.qcstyle 모듈이 제거되었습니다. 직접 대체로 qiskit.visualization.circuit.qcstyle를 사용하세요.