メインコンテンツへスキップ

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.dump および qasm2.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保存命令

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 に解析し、次に circuit_to_dag を使って その QuantumCircuitDAGCircuit に変換してください。

# 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
Snapshotqiskit-aer保存命令を使用
ExtensionError適切なエラークラスに置き換え

qiskit.primitives

qiskit.primitives モジュールにおける最も注目すべき変更点は、新しい primitives V2 インターフェース の導入です。このセクションでは、ワークフローを primitives V1 から V2 へ移行する方法と、V1 インターフェースで受け付ける入力に生じた変更点を説明します。

備考

1.0 リリース以降、1.0 より前の primitives インターフェースを「primitives V1」と呼びます。

V1 から V2 への移行

primitives V1 と V2 の API における正式な区別は、各 primitives 実装が継承する基底クラスにあります。新しい基底クラスへ移行する際は、qiskit.primitives からの元のインポートパスをそのまま使用できます。

移行元移行先
BaseEstimatorBaseEstimatorV2
BaseSamplerBaseSamplerV2

V2 primitives の qiskit コア実装(qiskit.primitives からインポート可能なもの)の名前は、statevector シミュレーター Backend を使ってローカルで実行できる実装としての目的を明確にするために変更されました。新しい名前には -V2 サフィックスは付きません

移行元移行先
qiskit.primitives.Estimatorqiskit.primitives.StatevectorEstimator
qiskit.primitives.Samplerqiskit.primitives.StatevectorSampler

V1 から V2 へ移行する際に考慮すべき概念的な違いがいくつかあります。これらの違いは基底クラスによって規定されますが、以下の例では qiskit.primitives に含まれる statevector 実装を用いて示します。

備考

以下の例では、次のインポートと primitive の初期化が行われていると仮定します。

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 primitives はベクトル化された入力を受け付けるように設計されており、1 つの Circuit を配列形式の仕様とグループ化できます。つまり、1 つの Circuit を n 個のパラメーターセット、n 個のオブザーバブル、またはその両方(Estimator の場合)の配列に対して実行できます。各グループは primitive unified bloc(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 primitives は複数の PUB を入力として受け付け、各 PUB は独自の結果を持ちます。これにより、V1 インターフェースでは常に可能とは限らなかった、さまざまなパラメーター・オブザーバブルの組み合わせで異なる Circuit を実行できます。

# 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 レベルで指定できる primitives の 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.runprecision 引数を導入し、primitive 実装が期待値の推定に対して達成すべき誤差バーを指定します:

      # 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")

unitary シミュレーターと statevector シミュレーターは、別の 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 パッケージへ移行されました。これには、fake provider クラス、デバイス固有のすべての fake Backend(FakeVigoFakeNairobiV2FakeSherbrooke など)、および fake Backend 基底クラスが含まれます。影響を受けるクラスはタブをクリックして確認してください。

  • 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_providerqiskit_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()

fake 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
備考

ダウンストリームライブラリの単体テストに fake Backend を使用していて、qiskit-ibm-runtime の依存関係に競合がある場合は、新しい Qiskit ネイティブの汎用 fake Backend の代替も利用できます。 以下の BackendV1 クラスが含まれます(直接置き換え可能):

以下は BackendV2 インスタンスを返す設定可能なクラスです:

fake_provider(特殊テスト用 Backend)

qiskit.providers.fake_provider の特殊テスト用 fake 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)は、ampangle のペアに置き換えられました。この表現は、特に角度キャリブレーションなどのキャリブレーション作業において、より直感的です。

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 を通じてパルスビルダーコンテキストに回路ゲート操作を注入することは、できなくなりました。 この削除は、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

バックエンドがキャリブレーションしたスケジュールを引き続き注入したい場合は、ゲートコマンドを呼び出す代わりに、以下のパターンを使用してください。

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 メソッドを通じて 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 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 の位相シフトが1周期分のシフトに対応するように定義されており、離散版とは異なる点に注意してください。また、シンボリックパルスライブラリでは複素数の振幅はサポートされなくなったため、代わりに floatampangle を使用してください。

ScalableSymbolicPulse

バージョン5以前の qpy ファイル(Qiskit Terra < 0.23.0)から、複素数の amp パラメータを持つ qiskit.pulse.ScalableSymbolicPulse オブジェクトを読み込むことはできなくなりました。複素数の amp は自動的に floatampangle)に変換されるため、移行作業は不要です。

この変更は以下のパルスに適用されます。

qiskit.qasm

qiskit.qasm にあったレガシーの OpenQASM 2 パーサーモジュールは、OpenQASM 2 のより高速かつ正確なパーサーを提供する qiskit.qasm2 モジュールに置き換えられました。高レベルな QuantumCircuit メソッドである from_qasm_file()from_qasm_str() は変わらず使用できますが、内部的に新しいパーサーを使用するようになります。ただし、qasm2 モジュールのパブリックインターフェースは同じではありません。qiskit.qasm モジュールは ply パーサーライブラリが返す抽象構文木(AST)へのインターフェースを提供していましたが、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.aqcAQCSynthesisPlugin を除く)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 に置き換えられました。このパスおよび対応する "noise_adaptive" レイアウトステージプラグインは Qiskit から削除されました。

CrosstalkAdaptiveSchedule Transpiler パスはコードベースから削除されました。このパスの内部動作は BackendV1 インスタンスの BackendProperties ペイロードにカスタムプロパティが設定されていることに依存していましたが、実際にこれらのフィールドを設定しているバックエンドが存在しないため、削除されました。

passmanager

ConditionalControllerFlowControllerLinear、および DoWhileController クラスの append メソッドは削除されました。代わりに、すべてのタスクはコントローラーオブジェクトの構築時に提供する必要があります。

qiskit.utils

qiskit.utils の以下のツールは、代替手段なしで削除されました。

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

これらの関数は qiskit.algorithms および qiskit.opflow モジュールのみで使用されていましたが、それらのモジュールも削除されました。

qiskit.visualization

qiskit.visualization.qcstyle モジュールは削除されました。直接の代替として qiskit.visualization.circuit.qcstyle を使用してください。