Qiskit 1.0 リリースノート
1.0.2
前奏曲
Qiskit 1.0.2 は 1.0 シリーズのマイナーバグフィックスリリースです。
バグ修正
-
の問題を修正しました。
convert_to_target()コンバーターが、BackendConfiguration.supported_instructions属性に制御フロー命令を指定すると、制御フロー命令を誤って無視してしまう問題を修正しました。BackendConfigurationオブジェクトで指定される典型的な場所です。 #11872 を修正。 -
を呼び出すと
EquivalenceLibrary.set_entry()を呼び出すと、ライブラリーの内部グラフ・オブジェクトが正しく更新されるようになった。 以前は、メタデータは更新されたが、グラフ構造は変更されなかった。BasisTranslatorのようなユーザーは古いルールを使い続けることになる。 #11958 を修正。 -
これにより
EvolvedOperatorAnsatzは、operators引数が空リストの場合を正しく処理するようになった。 以前はエラーになっていた。 -
の一貫性の問題を修正しました。
EvolvedOperatorAnsatzインスタンスの整合性の問題を修正しました。 以前は、このようなインスタンスにはQuantumRegisterでqregsを含んでいたが、現在はレジスタは作成されない。 この動作は、スーパークラスとより一貫しています。QuantumCircuit. -
のクラッシュを修正しました。
convert_to_target()このクラッシュは、qubitプロパティ( T1, T2 or frequency)が欠落している場合に発生します。 の欠落しているプロパティ値はQubitPropertiesはNoneで埋められている。 -
のパフォーマンスに関する問題を修正しました。
qpy.load()関数のパフォーマンスの問題を修正しました。 -
EstimatorPub.coerce()とSamplerPub.coerce()がBindingsArray型のパラメータを不適切に扱っていたバグを修正。 以前はValueError例外が誤って発生した。 -
で使用されるプリセット・パス・マネージャは、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合でも、制御フロー回路で失敗しなくなった。
transpile()によって使用されるプリセット・パス・マネージャは、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合、制御フローを持つ回路で失敗しなくなりました。 このような抽象的なターゲットは、すべてのコントロールフロー操作を許可するものとして扱われる。 #11906 を修正。 -
coerce()、入力が1つの、入れ子になっていないobservableの場合に、0-dの配列を返すように修正しました。 以前は、誤ってシングルディメンジョンにアップグレードされ、シェイプ(1,)。 -
Parameterが更新され、比較するインスタンスが常に同じハッシュを持つようになった。 以前はParameter.uuidだけが比較されていた。Parameterのインスタンスが、uuidパラメータ(通常は明示的に渡されない)に共通の値を使用して構築されていた場合、異なる名前のインスタンスを等しく比較することができました。 -
のバグを修正。
QuantumCircuit.draw()を修正しました。 Matplotlib ドロワーのカスタムスタイル辞書が実行時に変更される原因となっていました。
1.0.1
前奏曲
Qiskit 1.0.1 は、Qiskit 1.0.0 リリースで確認された少数のバグを修正したパッチリリースです。
バグ修正
-
カスタム・パルス命令のレガシー形式への変換におけるバグを修正。
qiskit.qobjフォーマットへの変換のバグを修正しました。 このバグはQiskit 1.0.0 で導入されたもので、カスタムパルス形状の命令を変換するとエラーが発生する。 修正後、変換は正しく行われ、カスタム・パルスは本来のpulse.Waveform。 #11828 を修正。 -
の問題を修正しました。
InverseCancellationトランスパイラ・パスの問題で、パラメータ値が一致していなくても、自己逆パラメータ化されたゲートを誤ってキャンセルしてしまう場合がある問題を修正しました。 修正 #11815。 -
BasePassManager.run()は、以前のPropertySetを複数回呼び出した場合でも、新しいワークフローに前のワークフローが漏れることはなくなった。 以前はPropertySetを使用していたため、無効なプロパティ情報がタスクに与えられていた可能性があった。 Qiskit 0.44 の動作と一致するようになった。 #11784 を修正。 -
convert_durations_to_dt()、関数が実際の単位を読み取るのではなく、入力がすべて秒単位であると仮定していたバグが修正された。 これは、報告された回路の持続時間に誤った桁をもたらす可能性がある。
1.0.0
前奏曲
Qiskit 1.0.0 をリリースできることを大変嬉しく思います。 このリリースは、Qiskitを安定した高性能な量子コンピューティングSDKに成熟させるための7年間の開発の集大成であり、Qiskitプロジェクトとコミュニティにとって新しい時代の幕開けです。 一般的なパフォーマンスと安定性の改善に加えて、 1.0.0 リリースで最も重要な変更は、安定性ポリシー、リリースサイクル、およびバージョン管理に関するものです。 Qiskitは現在、正式にセマンティック・バージョニングを使用しており、これは、 1.x リリースシリーズのライフサイクル全体において、プロジェクトが、その公開ドキュメント化されたAPIにおいて後方互換性を維持することにコミットしていることを意味する。 また、メジャー・バージョンに対するバグフィックス・サポートも開始し、次のメジャー・バージョンのリリースから6ヶ月間、サポート対象のブランチを利用できるようになりました。 これは 1.x と 0.x のメジャーシリーズから始まります。 0.46.x のリリースは、 1.0 のリリースから6ヶ月間、バグフィックスを含む定期的なパッチリリースとともにサポートが継続されます。 つまり、 0.46.x、2024-08年までサポートされる。 新ポリシーの詳細はこちらでご覧いただけます:
また、今回のリリースで重要なのはパッケージの変更である。 Qiskitがエレメントモデルを導入した2018-12年のQiskit 0.7 リリース以来、インストールする qiskit パッケージは、Qiskitを構成するエレメントを組み合わせたものをインストールするメタパッケージ(またはパッケージのパッケージ)になっています。 以前のリリースで発表されたように(詳細は 0.44.0, 0.45.3 および 0.46.0 リリースノート、およびこのブログ記事をご覧ください)、 1.0 のリリースで、コアSDK(以前は qiskit-terra )のみを公開する単一の qiskit パッケージへの移行を完了しました。 つまり、リリース >= 1.0.0 については、 qiskit-terra パッケージの使用を中止し、 qiskit のみを公開することになります。 このパッケージ構造の変更は Python パッケージインストーラ pip では完全にはサポートされていないため、 pip install -U qiskit を使って qiskit 0.46.0 から 1.0.0 へアップグレードすることはできません。 Qiskit 1.0.0 へのアップグレードには、別の仮想環境を作成してインストールを分離することを強くお勧めします。 パッケージングの変更と、さまざまなシナリオにおけるQiskit 1.0.0 のインストール方法について説明した、詳細な移行ガイドがあります:
https://qisk.it/1-0-packaging-migration
Qiskit 1.0.0 には、他のメジャーリリースと同様、数多くの新機能が搭載されています:
- この
QuantumCircuitクラスの内部dataクラスの内部構造はRustで書き直され、命令の引数をキャッシュすることでオブジェクトのメモリ効率を大幅に改善した。QuantumCircuit命令の引数をキャッシュすることで、オブジェクトのメモリ効率を大幅に改善しました。- のプリミティブ・インターフェイス定義の新バージョン。
qiskit.primitivesとBaseSamplerV2とBaseEstimatorV2抽象クラスが追加されました。 このインターフェイスの新バージョンでは、プリミティブへのベクトル化呼び出しのサポートが追加され、パラメータ値セットやオブザーバブルに対するスイープを効率的に指定できるようになった。- 新しい実験的なネイティブ・パーサー OpenQASM 3
qiskit.qasm3.loads_experimental()とqiskit.qasm3.load_experimental(). この新しいパーサーはまだ開発中で、いくつかの制限があり、実験的なものである。 しかし、使えるところでは、新しいパーサーは格段に速くなり、 OpenQASM 3 プログラムが無効な箇所をデバッグできるよう、診断エラーメッセージも改善されている。 この新しいパーサーはRustで書かれており、 OpenQASM3 をパースするために新しく開発されたRustライブラリに基づいている: https://github.com/Qiskit/openqasm3_parser
最後に、Qiskit 1.0.0 のリリースは、過去7年間の開発で蓄積された技術的負債を一掃する機会となりました。 Qiskit 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なぜなら、パラメータ化できない2つの標準的なゲートが共通かどうかを計算する代わりに、ライブラリからそれを調べるだけでいいからです。さらに
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には2つの新しいメソッドがある、get_parameter()とhas_parameter()があります。Parameterインスタンスを取得し、一致する名前のパラメータ(または指定されたインスタンス)が回路で使用されているかどうかをブール値で返します。 -
A
uuidプロパティがqiskit.circuit.Parameterクラスに追加されました。 高度な使用例では、このプロパティは、互いに等しいインスタンスを作成するために使用することができます。qiskit.circuit.Parameterインスタンスを作成するために使用できます。 -
新しいメソッドが追加された、
ParameterExpression.numeric()このメソッドは、完全に束縛されたパラメータ式を、記号評価の結果を正確に記述する最も制限の多い組み込みの Python 数値型に変換します。 例えば、記号整数はintになり、記号実数は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 )は、1つの回路に対してバインドするパラメータ値セットの配列を提供することに対応している。サンプラープリミティブ統一ブロック( 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バックエンドのインスタンスを構築します。 ユーザーは、手動でターゲットを構築することなく、バックエンドの量子ビット数、基底ゲート数、カップリングマップ、ダイナミック回路(制御フロー命令)の実行能力、命令キャリブレーション、測定タイムステップを設定することができる。 Qubitとゲートのプロパティ(持続時間、エラー)は、デフォルトの範囲からランダムにサンプリングして生成されます。 このランダム生成のシードは、バックエンド出力の再現性を確保するために固定することができる。 このバックエンドは、標準ライブラリーのゲートしかサポートしていないことに注意することが重要だ。 より柔軟なバックエンドが必要な場合は、変換に使用する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(). これらは通常、既存の純粋な Python よりも数倍速い。load()と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()コンシューマー向けMacbook Pro ( i7, 2020)では 300ms 以下であり、 25x のスピードアップである!実験的パーサーのサポート機能セットは、このプレビューバージョンでは非常に限定的ですが、Qiskit側とネイティブのRustベースのパーサーの両方が改善されるにつれて拡張されるでしょう。
この新しいパーサーの主な目標のひとつは、スピードの大幅な向上と並んで、最高品質のエラー診断を提供することです。 パーサーの他の部分と同様に、これらは進行中ですが、実験的なパーサーで無効な OpenQASM 3プログラムをパースするときに表示されるエラーメッセージの質が格段に向上しています。
-
OpenQASM 3 エクスポーター (
dump()およびdumps()の関数を参照)。qiskit.qasm3を参照)は、デフォルトで OpenQASM 3 のswitchステートメントの安定化された構文をサポートするようになった。switchステートメントの認証前シンタックスは、エクスポーターの 引数でExperimentalFeatures.SWITCH_CASE_V1experimentalフラグを使用することで利用可能です。 安定化した構文には機能フラグは必要ないが、まだ更新されていない他のツールと連動する場合は、experimentalフラグを渡す必要があるかもしれない。安定化フォームの構文は、
breakステートメントの終了に関して若干異なっており(もはや必須でも許可もされていない)、複数のケースは、Cスタイルのフォールスルーではなく、単一のcase行にまとめられるようになった。 詳しくは、 OpenQASM 3のswitch-case構文に関するドキュメントを参照されたい。
QPYの特長
-
新しい警告クラスを追加、
QPYLoadingDeprecatedFeatureWarningをQPYモジュールに追加しました。 このクラスは、再帰的に呼び出される多くのQPYローディング関数の場合のように、非推奨機能がコールスタックの可変ポイントでアクセスされる場合でも、非推奨警告を表示できるようにする。 -
新しいフラグ、
versionをqpy.dump()関数を追加した。 これによりqpy.dump()には、オプションで QPYフォーマットのバージョンを表す整数値を取ることができます。 これは、古いバージョンのQiskitで読み込まれるQPYファイルを生成する必要がある場合に便利です。 ただし、使用できるバージョンは限られており、最新のQPYバージョン(これがデフォルトです)と互換性のあるQPYバージョンである Version 10 (これはQiskit 0.45.0 で導入されました)の間のバージョンしか使用できません。 互換バージョンは、 1.x.y メジャーバージョンリリースシリーズ全体にわたって固定されたままとなる。 を呼び出す際のQPYフォーマットの後方互換性の保証は変更されない。qpy.load()これは、 0.x と 1.x リリース・シリーズ間の互換性と相互運用性を維持するために、ユーザーが古いバージョンのQPYを発行できるようにするだけである。
量子情報の特徴
-
を追加した。
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 and Gupta (2023) で発表された「テンソル化パウリ分解アルゴリズム」の実装を使用している。 例えば、コンシューマー向けのMacbook Pro(Intel i7、2020年)では、ランダムな10量子ビットの演算子を 250ms。
合成機能
-
を追加した。
qiskit.synthesis.synth_circuit_from_stabilizers()この関数は、与えられた一連のスタビライザーによって安定化された状態を出力する回路を返す。 -
AQCユニタリー合成プラグイン法は、デフォルトでより高速な目的関数評価を使用するようになり、合成時間が大幅に改善されました。
-
新しい合成法を追加
synth_qft_line()SABREと比較して、多数の量子ビットに対するSWAPの数を大幅に削減します。 -
クラス
TwoQubitWeylDecompositionクラスはqiskit.synthesis. このクラスは、2量子ビットのユニタリーのWeyl分解を適用することができる。 以前、このクラスが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が相殺され、2つのControlModifierが結合される。gate2の場合、すべての修飾子は削除され、注釈付き操作はその基本操作に置き換えられる。gate3の場合、複数の注釈のレイヤーが1つにまとめられる。パスのコンストラクタは
OptimizeAnnotatedパスのコンストラクタは、オプションの引数target、equivalence_library、basis_gates、recurseを受け付けます。recurse(デフォルト値)がTrue(デフォルト値)であり、target(デフォルト値)またはbasis_gates(デフォルト値)のいずれかが指定されている場合、パスは、ターゲットによって既にサポートされているか、等価ライブラリに属するゲートを除いて、ゲートのdefinition回路に再帰的に下降する。 一方、targetもbasis_gatesも指定されていない場合、またはrecurseがFalseに設定されている場合、パスは「トップレベル」の注釈付き操作のみを合成する、つまりdefinition回路に再帰的に降下しない。 この動作はHighLevelSynthesisトランスパイラ・パスは、注釈付き演算を1qubitゲートと2qubitゲートに "展開 "するために呼び出される必要がある。 -
新しい
HighLevelSynthesisPluginを追加。PermutationGateオブジェクトを追加した。 このプラグインを使用するには、ハイレベル合成コンフィグを定義する際に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) -
トランスパイラー・パスのコンストラクターに2つの新しい引数、
matrix_basedとmax_qubitsを追加。CommutativeInverseCancellationを追加した。matrix_basedがTrueの場合、パスは行列表現を使って、2つの演算が互いに逆であるかどうかをチェックする。 これにより、チェックがより強力になり、さらに、位相まで逆である演算のペアをキャンセルし、それに応じて回路のグローバル位相を更新することができる。 これは一般的に、実行時間の増加を犠牲にして、より多くの削減をもたらす。 引数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. Qiskitは組み込みの Python 警告(たとえばDeprecationWarningなど) を使い続けますが、Qiskit に特有なケースでは、警告はQiskitWarning. -
オプション機能テスター (
qiskit.utils.optionals)は、完全に見つからなかったオプションの依存関係(通常の状況)と、見つかったがインポート中にエラーを引き起こした依存関係を区別するようになりました。 後者の場合、インストールに失敗したか、互換性のないバージョンである可能性があるため、何が起きたかを知らせるOptionalDependencyImportWarningを発行する。インストールに失敗したか、互換性のないバージョンであった可能性があるからだ。
アップグレードの注意
-
Qiskit 1.0 は現在、
rustworkxのバージョン 0.14.0 を必要とします。 新しいtoken_swapper。PermutationGateの合成プラグインをサポートするために、最低バージョンが引き上げられた。HighLevelSynthesisPlugin. -
Qiskit をソースからビルドするためにサポートされる Rust の最小バージョンは 1.70 になりました。 これは、Qiskit 0.45.x および 0.46.0 リリースシリーズの 1.64 の最小サポート Rust バージョンから引き上げられています。
-
psutilへの依存が削除された。 psutil ライブラリは、以前は物理 CPU の数とシステム・メモリの合計を検出するためだけに使用されていましたが、この提供される情報は、追加の依存関係とオーバーヘッドを正当化するのに十分な価値をもたらさないため、削除されました。 によって使用されるデフォルトのプロセス数、および内部的に
parallel_map()および内部的にparallel_map()などtranspile()やPassManager.run()などが内部的に使用できる関数で使用されるデフォルトの並列プロセス数が、以前のリリースよりも多くなったり少なくなったりする可能性があるということです。 Qiskitが潜在的に使用するプロセス数を調整したい場合は、これらの関数への新しい引数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()など)。これはQiskit 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 -
symengine に必要な最小バージョンは >= 0.11 に変更されました。
回路アップグレードに関する注意事項
-
Qiskit 0.45.0 で非推奨となった
Instruction.qasmメソッドを削除した。 使用方法qiskit.qasm2.dump()を完全なQuantumCircuit代わりに -
プロパティ
Bit.registerとBit.indexは削除された。 これらはQiskit 0.25 (2021-04リリース)で非推奨となった。 量子ビットとビットは、現在では、"量子ビット "と "量子ビット "の文脈の中でしか生きていない。QuantumCircuit. プロパティの代わりにQuantumCircuit.find_bit()を使って、回路内のすべてのレジスタと、回路内のビットのインデックスを見つけることです。 -
Qiskit 0.45 で非推奨となったため、
QuantumCircuit.bind_parametersメソッドは削除されました。 あなたはQuantumCircuit.assign_parameters()をデフォルトのまま、そのまま置き換えられる。 -
から
Int1,Int2,BooleanFunction,classical_function()をインポートする。qiskit.circuitからのインポートは無効になりました。 代わりにqiskit.circuit.classicalfunctiontweedledumサブモジュールからオブジェクトをインポートする。 -
の
headerおよびextension_libデータ専用属性は、 Qiskit での非推奨に伴い削除されました。QuantumCircuitは、Qiskit 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(エアのセーブ指示に取って代わられた)、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.metadata0.43.0 をNoneに設定することはできなくなりました。 そのタイプはdictなので、これをクリアするには、{}に設定します。 -
属性
.Register.name_formatは Qiskit 0.40.0 で非推奨となったため削除されました。 レジスター名にはもう制限はなく、正規表現は単に[a-z][a-zA-Z0-9_]*.
プリミティブのアップグレードに関する注意事項
- を追加した。
BasePrimitiveJobクラスをプリミティブの抽象ジョブ・クラスとして追加しPrimitiveJobを継承BasePrimitiveJobの代わりにJobV1.
プロバイダー向けアップグレードノート
-
関数の2つの引数(
add_delayとfilter_faulty)のデフォルト値を変更。convert_to_target()関数の この変換機能は、デフォルトで遅延命令を追加し、欠陥命令を削除するようになった。 -
その
BackendPropertiesとPulseDefaultsモデル・オブジェクトFakeOpenPulse2Qが更新され、内部的な一貫性が保たれ、不足していた命令が追加された。 コンパイルターゲットとして以前のモデルオブジェクトに依存していた場合、Qiskit 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における3つのシミュレーターの移行経路を示している。-
状態ベクトルシミュレータ:
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()
-
-
Qiskit 0.46.0 で非推奨とされた
ConfigurableFakeBackendクラスを削除した。 代わりに、適切なFakeBackendを使うことができる。 -
非推奨の
qiskit.providers.fake_providerモジュールはqiskit-ibm-runtimePython パッケージに移行されました。 このためqiskit.providers.fake_providerの以下の要素はQiskitで非推奨となったため削除されました。 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クラスに取って代わられ、Qiskit では非推奨となったため削除されました。 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にリリースされたQiskit 0.39 (with qiskit-terra 0.22 )から非推奨となった。 代わりにSymbolicPulseを使用し、詳細についてはそのドキュメントを確認すること。
OpenQASM アップグレードに関する注意事項
- クラスの
qasm()メソッドQuantumRegisterとClassicalRegisterのメソッドは削除された。 これらは、 OpenQASM 2 エクスポーターのレガシー実装の内部詳細であった。 プログラムを OpenQASM 2 にエクスポートするにはqasm2.dump()またはqasm2.dumps().
QPY アップグレードに関する注意事項
-
QPYの最新フォーマットバージョンは現在 Version 11で、デフォルトでは次のように実行される。
qpy.dump(). -
Qiskit 0.40.0 で非推奨となったため、モジュールパス
qiskit.circuit.qpy_serializationが削除されました。 QPYシリアライズの場合はqiskit.qpyを使用します。
量子情報アップグレードに関する注意事項
-
の非推奨
__getitem__/__setitem__マジックメソッドを削除した。Clifford. これらのメソッドは、2023-07にリリースされたQiskit 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()は、 Qiskit 0.25.0 での非推奨に従い、任意の入力をそのマークされた期待型に強制しようとしなくなりました。 マークされた型の入力を各引数に直接渡す。
合成アップグレードに関する注意事項
-
以前
qiskit.quantum_infoは削除されました。 これらの関数は、2023-01のQiskit 0.40.0 リリースで非推奨とされました。decompose_clifford代わりにqiskit.synthesis.synth_clifford_full()関数を使うべきである。decompose_cnotdihedral代わりにqiskit.synthesis.synth_cnotdihedral_full()関数を使うべきである。
トランスパイラ アップグレード ノート
-
非推奨のメソッド
Target.aquire_alignmentは削除されました。 Qiskit 0.43 (released 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クラスを削除した。 このクラスは Qiskit 0.45 で非推奨となり、その代わりにBasisTranslatorとUnrollCustomDefinitions.なお
BasisTranslatorとUnrollCustomDefinitionsEquivalenceLibraryは、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トランスパイラー・パスは削除されました。 Qiskit 0.46.0 で非推奨とされた。 に取って代わられた。VF2LayoutとVF2PostLayoutに取って代わられ、バックエンドの報告されたノイズ特性に基づいてレイアウトを設定するようになった。 パスに伴い、layout_methodプラグイン"noise_adaptive"は削除された。 -
非推奨の
CrosstalkAdaptiveScheduleトランスパイラー・パスは削除されました。 Qiskit 0.46.0 で非推奨とされた。 このパスの内部動作は、カスタムプロパティがBackendPropertiesインスタンスのペイロードにBackendV1インスタンスのペイロードに設定されているカスタムプロパティに依存していたためです。 どのバックエンドもこれらのフィールドを設定していないため、このパスは削除された。 カスタムワークフローでパスに依存する場合は、Qiskit 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インスタンスを関数として呼び出す際のエイリアスキーワードは、 Qiskit 0.40.0 で非推奨となったため削除されました。 第一引数として位置的に引数を渡すか、新しい名前unitaryを使うべきである。 -
Qiskit 0.40.0 で非推奨となったため、専用のトランスパイラパス
LinearFunctionsSynthesisは削除されました。 非推奨となって以来、このラッパーは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, ) ) -
内蔵フローコントローラの append メソッドが削除された。 これには以下が含まれる
ConditionalController.appendDoWhileController.appendFlowControllerLinear.append
フローコントローラのタスクパイプラインは凍結され、コントローラインスタンスの作成時に渡される必要がある。
-
の
passessメソッドを削除した。PassManagerとStagedPassManagerメソッドを削除しました。 しかしこの形式では、条件分岐やネストされた条件など、より複雑なパス・パイプラインを効率的に表現することはできない。 この表現を使用する代わりに、次のパターンを使用してくださいpm = PassManager(...) pm.to_flow_controller().tasksこれはタプル形式で線形化された基本タスクインスタンスを直接返す。
-
から
max_iteration引数が削除された。PassManager.append()そしてPassManager.replace(). -
以下のレガシークラスは、Qiskitで非推奨となったため、パスマネージャとトランスパイラモジュールから削除されました。 0.46:
qiskit.passmanager.flow_controllers.FlowControllerqiskit.transpiler.fencedobjs.FencedObjectqiskit.transpiler.fencedobjs.FencedPropertySetqiskit.transpiler.fencedobjs.FencedDAGCircuitqiskit.transpiler.runningpassmanager.RunningPassManager
可視化アップグレードに関する注意事項
-
Matplotlib を使用した回路可視化のデフォルトスタイルが
"iqp"に変更され、 IBM Quantum Platform と一致するようになりました。 -
非推奨モジュール
qiskit.visualization.qcstyleは削除されました。 このモジュールは Qiskit 0.39.0 以降、非推奨となりました。 代わりに、qiskit.visualization.circuit.qcstyle。 -
を渡すサポートは廃止されました。
QuasiDistribution,ProbDistributiondataまたはディストリビューション・ディクショナリをplot_histogram()を渡すサポートは廃止されました。 この機能はQiskit 0.39.0 リリース(2022-10)で非推奨とされました。 からのヒストグラムをプロットしたい場合は、代わりにQuasiDistribution,ProbDistributionまたは分布辞書からヒストグラムをプロットしたい場合はplot_distribution()関数を使うべきである。 -
QiskitTimelineStyleのlink_interval_dtキーが削除された。 新しい名前link_interval_percentを使うべきだ。
各種 アップグレードの注意
-
オブジェクト
qiskit.Aerは Qiskit 0.46 で非推奨となったため削除されました。 その代わりに、qiskit_aer.Aer。 -
Qiskit 0.46 で非推奨となったため、
qiskit.providers.aerからのインポートは機能しなくなりました。 代わりに、qiskit_aerからインポートする必要がある。 -
パルスジョブは、Aerのシミュレーション機能の廃止に伴い、偽のバックエンドではサポートされなくなりました。 回路オブジェクト以外のパルスレベルのシミュレーションには、 Qiskit Dynamicsのような専用ライブラリの使用を検討してください。
-
Qiskitの
execute()機能が削除されました。 この関数は、いくつかのtranspileオプションを使って回路をトランスパイルし、いくつかのrunオプションを使ってバックエンドでそれを実行するための高レベルのラッパーとして機能した。 同じことをするには、明示的にtranspile()関数(適切なtranspileオプション付き)の後にbackend.run()(適切な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オブジェクトは削除されました。 このエイリアスオブジェクトはQiskit 0.40.0 リリースで非推奨とされました。 このエイリアス・オブジェクトは、属性へのアクセスをqiskit.providers.ibmq.IBMQにリダイレクトする。 現在、qiskit-ibmq-providerパッケージは引退し、独自の名前空間を維持するqiskit-ibm-providerパッケージに取って代わられているため、このエイリアスを維持することはもはや意味がない。qiskit.IBMQのエイリアスに依存していた場合は、使用方法をqiskit-ibm-providerパッケージに移行する必要があります。詳細は移行ガイドを参照してください。 -
以前はQiskitからいくつかのデータをインタラクティブに視覚化するためのJupyterマジックとウィジェットを含んでいた、非推奨のモジュール
qiskit.tools.jupyter。 このモジュールは Qiskit 0.46.0 で非推奨となった。 この機能のほとんどは、レガシーのqiskit-ibmq-providerパッケージと直接結びついており、もはや有効ではなかったため、このモジュールは削除された。 同様の機能は qiskit-ibm-provider パッケージのqiskit_ibm_provider.jupyterモジュールからも利用できます。 -
非推奨モジュール
qiskit.tools.monitorを削除した。JobV1このモジュールには、主にレガシーなqiskit-ibm-providerパッケージのジョブインスタンスを追跡するためのツールが含まれていました。 このモジュールは Qiskit 0.46.0 で非推奨とされた。 レガシーパッケージ(qiskit-ibm-provider)と直接結びついていたため、削除されることになった。 -
非推奨のインポートパス
qiskit.test.mockを削除しました。これは、モック・バックエンド用のインポートをqiskit.providers.fake_provider. このモジュールは Qiskit 0.37.0 で非推奨とされた。 このモジュールを使っている場合は、インポートをqiskit.test.mockからqiskit.providers.fake_providerに更新してください。 -
qiskit.testモジュールは公開モジュールではなくなった。 これは決して公開されることを意図したものではなく、Qiskit自身のテストスイート以外で使用されることもない。 すべての機能は Qiskit 固有のものであり、代替機能は提供されていません。同様の機能が必要な場合は、独自のテストハーネスに含める必要があります。 -
非推奨の
qiskit.tools.visualizationモジュールは削除された。 このモジュールはQiskit 0.46.0 リリースで非推奨となりました。 このモジュールはQiskitの視覚化モジュールの元の場所からレガシーリダイレクトされたもので、Qiskitの。qiskit.visualization0.8.0 に移動されました。 もしまだこのパスを使っているのであれば、インポートをqiskit.tools.visualizationからqiskit.visualization. -
非推奨の
qiskit.tools.eventsモジュールと、それが公開していた対応するqiskit.tools.progressbarユーティリティは削除された。 Qiskit 0.46.0 リリースで非推奨となりました。 このモジュールの機能はあまり使われておらず、 tqdmのような専用パッケージの方がよくカバーされていた。 -
qiskit.toolsモジュールが取り外された。 このモジュールは Qiskit 0.46.0 で非推奨となった。 このモジュールの内容は、qiskit.tools.parallel_map関数を除いてすべて削除された。qiskit.utils.parallel_map()から使えるようになりました。
プリミティブの非推奨化
- Qiskit 0.46 で非推奨となったため、
PrimitiveJob.submit()とPrimitiveJob.wait_for_final_state()のメソッドは削除されました。 これらはパブリック・メソッドとして意図されたものではなく、誤った継承構造の遺産だった。
バグ修正
-
量子ビットのサブセットのみが要求された場合、不適切な測定スケジュールが返されるのを修正しました。 以前は、すべての量子ビットの測定スケジュールが返されていた。
-
textの回路ドロワーで、クラスでない操作を表示する際の問題を修正。circuit.instruction.Instructionクラスではありません。 これらの操作は引き出しを故障させる原因となる。 例としてはCliffordそしてAnnotatedOperation. -
トランスパイラ・パスの問題を修正しました。
SetLayoutトランスパイラ・パスの問題を修正しました。重複したエントリを含む無効な整数リストが入力されると、無効なLayoutが生成され、その後のトランスパイラ・パスが暗号化されたエラーで失敗する問題を修正しました。 が呼び出されたときにキャッチされるようになった。SetLayout.run()が呼び出されるとInvalidLayoutErrorエラーが発生し、整数リストに重複したエントリがあることを示します。 -
QPY
qpy.dump()とqpy.load()を使用)は、アノテーション付き操作(AnnotatedOperation). -
電話
copy()またはcopy_empty_like()を呼び出すと、BlueprintCircuit。global_phaseをコピーに正しく伝搬するようになった。 以前は、コピー後のグローバル位相は常にゼロだった。 -
QuantumCircuit.compose()が正しく発生するようになった。CircuitErrorqubitsclbitsを正しく発生させるようになった。 -
QPY
qpy.dump()とqpy.load())はクリフォード演算子(Clifford). -
mplの回路ドロワーで、デフォルトのケースが空の場合、テキストがボックスの端を越えて印刷される問題を修正。SwitchCaseOpデフォルトのケースが空の場合、テキストが -
の量子ビット引数ブロードキャストでは
QuantumCircuit.delay()は、意図した通り、個々のDelayを生成するようになった。 以前は、特定の反復記号(例えばsetのような)が与えられた場合、代わりに無言で無効な回路を生成し、異常な場所で失敗する可能性があった。 -
プリセット・パス・マネージャー
transpile()で生成されたような)プリセットパスマネージャを実行するときに発生する問題を修正しました。generate_preset_pass_manager()によって生成されたような)を使ったり実行したりする際に、出力に余分なバリアが追加されてしまう問題を修正しました。QuantumCircuit. 場合によっては、いくつかの単一量子ビットBarrierディレクティブが出力回路に含まれることもある。 これは、不連続接続のための内部処理によって生成された内部状態で、誤って出力回路に加えられていた。 #11649を修正 -
からのゲートのキャリブレーションデータをロードしようとしたときのエラーを修正しました。
Targetからゲートのキャリブレーション・データをロードしようとしたときのエラーを修正しました。 これは、バックエンドが部分的な較正データしか報告しない場合に発生します。たとえば、コマンド定義で波形パルスを参照しても、その波形パルスがパルス・ライブラリに含まれていない場合などです。 この状況では、Qiskitパルスオブジェクトを構築することができず、結果としてキャリブレーション用のパルススケジュールを構築することができませんでした。 校正データが不完全な場合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そして今、2番目の回路は正しく最適化されている:
q_0: ────── ┌─┐┌─┐ q_1: ┤M├┤M├ └╥┘└╥┘ c: 1/═╩══╩═ 0 0 -
QPYシリアライゼーションで、以下のような問題が修正されました。
QuantumCircuitに同じ属性を持つ複数のカスタム命令インスタンスが含まれていた場合の QPY シリアル化の問題を修正しました。name属性を持つ複数のカスタム命令インスタンスが含まれる場合のQPYシリアライズの問題を修正しました。 Version11 以前のQPYフォーマットのバージョンでは、QPYペイロードはこれらのインスタンスを区別せず、回路内の最初のインスタンスのプロパティのみをシリアライズしていた。 このため、カスタム命令の他のプロパティが異なっていても名前が同じであれば、デシリアライズが正しく行われない可能性がある。 これはQPY Version 11で修正され、カスタム命令の各インスタンスが個別にシリアライズされるようになり、重複した名前による潜在的な衝突はなくなりました。 8941を修正。 -
関数の問題を修正した。
qpy.dump()関数の問題を修正しました。use_symengineフラグがTrueと評価される真理値オブジェクトに設定されていますが、実際にはブール値Trueではない場合、生成される QPY ペイロードが破損していました。 例えば、use_symengineをHAS_SYMENGINEに設定すると、このオブジェクトはboolとしてキャストされたときに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とXXMinusYYGateget_standard_gate_name_mapping()から返されるパラメータは、 のパラメータだけでなく、 の初期回転も含むようになりました。 -
パスは
TemplateOptimizationのネイティブな記号式フォーマットを使ってパラメトリック式を返すようになりました。ParameterExpressionを使うようになりました。 ほとんどのサポートされているプラットフォームでは、これは式がSymengineオブジェクトになることを意味する。 以前は、パスが不一致のオブジェクトを返すことがあり、パラメータ処理コードで後で失敗する可能性があった。