Qiskitの v1.0 機能の変更点
このガイドでは、Qiskit v1.0 における主要な機能変更について、モジュールごとに分類して移行手順を説明します。 右側の目次から、ご興味のあるモジュールへ移動してください。
Qiskitの v1.0 移行ツール
移行プロセスを簡単にするために flake8-qiskit-migration ツールを使って、あなたのコードから削除されたインポートパスを検出し、代替案を提案することができます。
もし pipx がインストールされていれば を実行するだけである。
pipx run flake8-qiskit-migration <path-to-source-directory>これにより、パッケージが一時的な仮想環境にインストールされ、あなたのコード上で実行される。 実行する。
pipx を使用したくない場合は、手動で新しい環境を作成することができます。 環境を手動で作成することができます。 この方法では nbqa のコード例をチェックするために Jupyterノートブックでコード例をチェックするのにも使える。 終了したら環境を削除してください。
# 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.
詳細はプロジェクトの リポジトリをご覧ください。
グローバルインスタンスと関数
エア
この qiskit.Aer オブジェクトは、Qiskitの v1.0 では利用できません。 その代わりに、
名前 qiskit_aer 空間にある同じオブジェクトを使用してください。これはそのまま置き換え可能です。
qiskit_aerインストールするには、次のコマンドを実行してください:
pip install qiskit-aerBasicAer
この qiskit.BasicAer オブジェクトは、Qiskitの v1.0 では利用できません。 移行オプションについては、
こちら
basicaer 移行に関するセクションをご覧ください。
実行
この qiskit.execute 関数は、Qiskitの v1.0 では利用できません。 この
関数は、Qiskit の
関数
transpileと
run関数をラップする高レベルなラッパーとして機能していました。
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 は プリミティブをサポートしないバックエンド用の汎用ラッパーです:
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 機能は Qiskit から削除されました。 これは レガシー 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 の保存方法を使用する |
ExtensionError | 関連するエラークラス |
qiskit.primitives
モジュールで最も注目すべき変更は qiskit.primitives モジュールの最も注目すべき変更点は 新しいプリミティブ V2 インターフェイスの導入である。 このセクションでは プリミティブ V1 からプリミティブ V2 へワークフローを移行する方法と、 インターフェースが受け入れる入力におけるいくつかの変更点を示します。 V1 インターフェースで受け付けられる入力で行われたいくつかの変更を示します。
v1.0 のリリース以降、 pre-1.0 のプリミティブインターフェースを「primitives V1 」と呼ぶことにします。
V1 から V2 への移行
プリミティブ V1 と V2 API の正式な違いは、プリミティブの実装が継承する基本クラスです。 プリミティブの実装が継承する基本クラスです。 新しい基本クラスに移行するには、次のようにすればよい。 qiskit.primitivesから元のインポートパスを維持することができます:
からの移行 | 以下で置換 |
|---|---|
BaseEstimator | BaseEstimatorV2 |
BaseSampler | BaseSamplerV2 |
V2 プリミティブの qiskit コア実装の名前 ( qiskit.primitives からインポート可能なもの)、 プリミティブのqiskitコア実装 ( からインポートされるもの) の名前は、ステートベクタシミュレータバックエンドでローカルに実行できる実装としての目的を明確にするために変更されました プリミティブのqiskitコア実装(importされるもの)の名前を変更しました。 新しい名称には、 -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 プリミティブは、 ベクトル化された入力を受け入れるように設計されており、単一の回路を配列型の仕様と組み合わせて使用することができます。 つまり、1回の反復処理で、 パラメータセット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)-
Sampler : 「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 の実装で一般的に公開されている。shotsrun()で指定できるようになった。 レベルで指定できるようになった。 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での Estimatorのobservable引数は使用できなくなりました。 代わりに を使って明示的に引数を変換する。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ネイティブの汎用フェイクバックエンドを見つけることができます。 qiskit-ibm-runtime 依存関係にコンフリクトがある場合、新しいQiskitネイティブな汎用偽バックエンドの代替を見つけることもできます。
これには、以下の BackendV1 (ドロップイン振替)クラスが含まれる:
qiskit.providers.fake_provider.Fake5QV1qiskit.providers.fake_provider.Fake20QV1qiskit.providers.fake_provider.Fake7QPulseV1qiskit.providers.fake_provider.Fake27QPulseV1qiskit.providers.fake_provider.Fake127QPulseV1
これは BackendV2 インスタンスを返す設定可能なクラスです:
fake_provider (特殊テスト用バックエンド)
の特別なテスト目的のための偽のバックエンド・クラスがあります。 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 は オブジェクトを手動でトランスパイルしてスケジューリングすることで、ビルダー・コンテキストに注入できます。 オブジェクトに注入できます。
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 の位相が1サイクルずれるように定義されていることに注意されたい。 対応する。 また、複素振幅はシンボリック・パルス・ライブラリではサポートされなくなったことに注意してください。 代わりに float, amp, angle を使用してください。
ScalableSymbolicPulse
バージョン5以前のqpyファイルから、複雑な パラメータを持つライブラリ qiskit.pulse.ScalableSymbolicPulse amp オブジェクトをロードすることができなくなりました。 (Qiskit Terra < 0.23.0 )。 複雑な amp は自動的に (, ) に変換されるため、移行作業は必要ない。 は自動的に float (amp, angle) に変換されるからである。
この変更はこれらのパルスに適用される:
qiskit.qasm
以前 qiskit.qasm にあったレガシー OpenQASM 2パーサーモジュールは、 に取って代わられました。 モジュールに取って代わられました。 qiskit.qasm2 モジュールに取って代わられた。 OpenQASM より高速で正確なパーサーを提供します。 ハイレベルの 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テストスイート以外での使用も意図していません。 すべての機能はQiskit固有のものであり、代替機能は提供されていません。 もし同様の機能が必要であれば、あなた自身のテストハーネスに組み込んでください。 テストハーネスに含める必要があります。
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可視化モジュールの元の場所からレガシーリダイレクトされ に移動しました。 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" レイアウトステージ プラグインはQiskitから削除されました。
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 を直接交換してください。