Qiskit 0.39 リリースノート
0.39.5
Terra 0.22.4
前奏曲
Qiskit Terra 0.22.4 は、 0.22 シリーズで確認されたいくつかのバグを修正したマイナーバグフィックスリリースです。
バグ修正
-
のバグを修正した。
BackendSamplerのバグを修正した。run()メソッドが2回連続して呼び出された場合にエラーを発生させるバグを修正した。 -
の2つのバグを修正した。
ComposedOpここでComposedOp.to_matrix()を持つコンポジションとグローバル係数を持つコンポジションに対して正しい結果が得られないという2つのバグを修正した。StateFnを持つコンポジションとグローバル係数を持つコンポジションに対して正しい結果が得られないという2つのバグを修正しました。 #9283 を修正。 -
プリミティブの問題を修正しました、
SamplerとEstimatornumpy.ndarrayが動作しない問題を修正しました。 -
のバグを修正。
SamplingVQEaggregationのバグを修正した。 これで集計関数と、それに伴う CVaR 期待値を正しく指定できるようになった。 -
パフォーマンスのバグを修正。
SamplingVQEが固有状態のエネルギーを低速で評価するパフォーマンスのバグを修正した。 -
のベータパラメータの自動評価を修正。
VQD入力のサポートを追加しました。SparsePauliOp入力のサポートを追加しました。また、プリミティブの非同期実行を活用するために、エネルギー評価関数を修正しました。 -
の問題を修正しました。
Statevector.probabilities_dict()とDensityMatrix.probabilities_dict()メソッドで、qargs引数が指定された場合に、非qubitシステムに対して不正な結果を返していた問題を修正しました。 9210を修正 -
によるいくつかの
classmethodの処理を修正した。wrap_method()による Python 3.11 の処理を修正した。 Previously, in Python 3.11,wrap_methodwould wrap the unbound function associated with theclassmethodand then fail when invoked because the class object usually bound to theclassmethodwas not passed to the function. Python 3.11.1 から、この問題はQiskitTestCaseに影響し、他のテストコードからインポートできなくなった。 #9291 を修正。
エア 0.11.2
変更なし
IBM Q プロバイダー 0.19.2
変更なし
0.39.4
Terra 0.22.3
変更なし
エア 0.11.2
新機能
- Python 3.11 をサポートする Qiskit Aer を実行できるようにした。
既知の問題
- AerStatevector の2つのバグを修正した。 AerStatevector は、matrix_product_state メソッドでは有効になっていない mc* 命令を使用する。 このコミットにより、 AerStatevector、MC*を使用せず、H、X、Y、Z、U、CXを使用するように変更された。 AerStatevector また、命令が空の QuantumCircuit に分解された場合も失敗した。 今回のコミットでは、そのような指示が可能になった。
バグ修正
-
aオブジェクトから
AerSimulatorインスタンスをインスタンス化するためのAerSimulator.from_backend()メソッドのサポートを修正した。BackendV2オブジェクトからインスタンスを生成する 以前は、AerSimulator.from_backend()をBackendV2オブジェクトでAerError。 -
BackendV2ReadoutErrorオブジェクトを持つ が、ゲート以外の命令では過剰な s を持つノイズモデルを生成する可能性があるバグを修正しました。NoiseModel.from_backend()QuantumErrorこのコミットでは、NoiseModel.from_backend()をBackendV2オブジェクトで更新し、対応するBackendV1オブジェクトで呼び出されたものと同じノイズモデルを返すようにした。 つまり、結果として得られるノイズモデルには、測定値に関するQuantumErrorsは含まれず、リセットなど他の非ゲート命令に関する熱緩和エラーのみが含まれる可能性がある。 なお、小節にはまだReadoutErrorsが含まれている。 -
NoiseModel.from_backend()で、temperaturekwarg をデフォルト以外の値で使用すると、指定された温度の励起状態ポピュレーションが正しく計算されないバグを修正。 以前は、ボルツマン分布の計算に係数2が追加されていたため、励起状態の母集団の値が誤って小さくなっていた。 -
コントロール・フロー・コンパイラにおいて、実行中に無関係な命令がコントロール・フロー本体の「内部」に出現し、誤った結果を引き起こす可能性があった不正なロジックを修正しました。 例えば、以前は:
from qiskit import QuantumCircuit from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") circuit = QuantumCircuit(3, 3) circuit.measure(0, 0) circuit.measure(1, 1) with circuit.if_test((0, True)): with circuit.if_test((1, False)): circuit.x(2) with circuit.if_test((0, False)): with circuit.if_test((1, True)): circuit.x(2) circuit.measure(range(3), range(3)) print(backend.run(circuit, method=method, shots=100).result())と表示された場合、
{'010': 100}。これは、ネストされたコントロール・フロー演算が、本来実行されるべきqubit 2の最初のXゲートを誤って飛び越えてしまうためである。 -
T2 > 2 * T1 のような物理的でないデバイス・パラメータを報告するバックエンドを供給する際、その推定における統計的エラーにより
NoiseModel.from_backend()が冗長な警告を表示するバグを修正。 今回のコミットでは、このような警告は、noise.deviceモジュール内で行われているように、理論的な範囲に切り捨てる以外に手段がないという意味で、ユーザーにとってアクションを起こすことができないため、削除した。 修正されたバグの詳細については、 1631号を参照してください。 -
これはGPU状態ベクトルシミュレータの修正です。 チャンク配布はGPU上の空きメモリをすべて割り当てようとしましたが、メモリ割り当てエラーが発生しました。 つまり、この修正では空きメモリの80パーセントが割り当てられる。 また、これはノイズサンプリングが適用されたときのマトリックスバッファのサイズを固定する。
-
これは AerState、キャッシュ・ブロッキングで実行される問題の修正である。 AerState Aerのトランスパイラーがキャッシュ・ブロッキングの設定を誤り、量子ビットをスワップするアルゴリズムが誤って動作してしまったのだ。 この修正により、このトランスパイラを使用するように AerState が修正された。 より具体的には、 AerState を使用する場合、変換後、スワップされた量子ビットマップは元のマップに復元される。 この修正は、 AerStatevector、マルチGPUを使用するために必要である。
-
これは AerStatevector の修正である。 terraのStatevectorから直接 AerStatevector。 この修正により、 AerStatevector’s の入力としてStatevectorを使用できるようになった。
-
SamplerResult.quasi_distsには、量子ビットの数に関するデータが含まれている。QuasiDistribution.binary_probabilities()は正しい長さのビット列を返す。 -
以前のシードは AerStatevector で初期化されておらず、サンプリングされた結果は常に同じである。 このコミットにより、各サンプリングごとにシードが初期化され、サンプリングされた結果を変化させることができる。
IBM Q プロバイダー 0.19.2
変更なし
0.39.3
Terra 0.22.3
前奏曲
Qiskit Terra 0.22.3 は、 0.22 シリーズのさらなるバグを修正した、マイナーなバグ修正リリースです。
バグ修正
-
AdaptVQEが補助演算子をサポートすることを正しく示すようになった。 -
回路の引き出し(
QuantumCircuit.draw()とcircuit_drawer()) は、回路の内容がすべてのビットを個別に描画する必要がある場合、デフォルトの引数を使用してもcregbundleパラメータに関する警告を出さなくなりました。 これは、新しいスタイルのコントロール・フロー操作で回路を描こうとしたときに現れやすかった。 -
の値が1より大きい場合に
QNSPSAmax_evals_groupedが1より大きい値に設定された場合に失敗するバグを修正。 -
パスの問題を修正しました。
SabreSwapパスの問題を修正しました。seed引数を指定せずにパスを複数回実行すると、実行間で同じ乱数ジェネレーターのシードが再利用され、異なるシードが使用されることはありません。 このため以前は、seedが指定されていない場合でも、実行のたびに同じ結果が返されていた。 -
プリミティブクラスの問題を修正しました、
BackendSamplerとBackendEstimatorインスタンスをpickleでシリアライズできない問題を修正した。 一般に、これらのクラスはBackendV2そしてBackendV1インスタンスはシリアライズ可能である必要はありません(多くの場合そうではありません)がBackendSamplerとBackendEstimatorのクラス定義は、もはやpickleの使用を妨げません。 -
pulse.Instruction.draw()、以前と同じように成功する。 このメソッドは非推奨であり、代替の予定はないが、非推奨期間中はまだ使えるはずである。
エア 0.11.1
変更なし
IBM Q プロバイダー 0.19.2
変更なし
0.39.2
Terra 0.22.2
前奏曲
Qiskit Terra 0.22.2 はマイナーなバグフィクスリリースで、 Python 3.11 を初めて公式にサポートした。
バグ修正
-
バックエンドのプリミティブ・クラスの問題を修正しました。
BackendSamplerとBackendEstimatorインスタンスで実行できない問題を修正した。BackendV1max_experimentsインスタンスで実行できない問題を修正しました。BackendConfiguration. -
のバグを修正しました。
VF2PostLayoutが定義されたバックエンドのためにトランスパイルするときのパスのバグを修正しました。Targetを持つバックエンドに対してトランスパイルする際に、相互作用グラフが正しく構築されないというパスのバグを修正しました。 その結果、グラフが必要以上に複雑になり、実行時間が長くなる可能性がある。 -
Pulse式パーサーは、Jupyterノートブックから呼び出されても定期的にハングしなくなった。 これは、メモ化が特に評価しにくいと思われる再帰オブジェクトの内部
deepycopyを避けることによって達成される。
エア 0.11.1
変更なし
IBM Q プロバイダー 0.19.2
変更なし
0.39.1
Terra 0.22.1
前奏曲
Qiskit Terra 0.22.1 はバグフィックスリリースで、 0.22.0 リリース以降に確認されたいくつかのマイナーな問題に対処しています。
非推奨のメモ
- の
pauli_listkwarg はpauli_basis()は非推奨となった。pauli_basis()を返すようになりました。PauliList. この引数はQiskit Terra 0.22.0 から時期尚早に削除されたため、pauli_list``argument. Now, the argument has been restored but will emit a ``DeprecationWarningを利用していたユーザーの互換性を壊してしまいました。 Qiskit Terra 0.22.0。PauliListは常に返されるからです。
バグ修正
-
を修正した。
BarrierBeforeFinalMeasurements最終測定レイヤー直前のルースClbitの条件がある場合のトランスパイラ・パスを修正。 以前は、ビットが内部の一時回路に存在しないとして失敗していた。 8923を修正 -
の等号チェッカーは
QuantumCircuitとDAGCircuit(同じ型のオブジェクトとの)等号チェッカーはシングルビットの条件を正しく処理するようになった。 以前は、ビットが回路命令の他の特性が得る「意味的」チェックではなく、「厳密な」等号チェックを使用するため、等号の誤検出が発生していた。 -
におけるクラシック・ビットの取り扱いを修正した。
StochasticSwapの古典的ビットの扱いを修正。 以前は、制御フロー演算は、外部回路の古典的なビットをすべて含むように拡張され、再び縮小されることはなかったため、命令が必要と報告したビット数と実際に供給されたビット数との間に不一致が生じた。 修正 #8903 -
グローバルに定義された
Targetクラスの 以前は2つの方法があった、operations_for_qargs()とoperation_names_for_qargs()の2つのメソッドは、ターゲットに存在するグローバルに定義された理想演算を無視したり、間違って処理したりしていた。 例:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target(num_qubits=5) target.add_instruction(CXGate()) names = target.operation_names_for_qargs((1, 2)) ops = target.operations_for_qargs((1, 2))は、
KeyErrorや空文字を返す代わりに、namesには{"cx"}を、opsには[CXGate()]を返すようになった。 -
メソッドの問題を修正しました。
Target.add_instruction()メソッドにおいて、propertiesの引数の一部として、無効な量子ビット数の引数を受け取ってしまう問題を修正しました。 例:from qiskit.transpiler import Target from qiskit.circuit.library import CXGate target = Target() target.add_instruction(CXGate(), {(0, 1, 2): None})これにより、ターゲットとの対話時に実行時問題が発生する代わりに、
TranspilerErrorが正しく発生するようになった。 8914を修正 -
可視化関数の問題を修正。
plot_state_hinton()可視化関数の問題を修正しました。 8446を修正 <https://github.com/Qiskit/qiskit/issues/8446> -
の出力を修正した。
plot_state_hinton()関数の出力を修正し、状態ラベルの順序が正しく並び、画像が自然な行列の順序と一致するようにした。 修正 #8324 -
プリミティブクラスの問題を修正しました、
BackendSamplerおよびBackendEstimatorの問題を修正しました。 すべてのバックエンドが無制限のバッチサイズをサポートしているわけではなく(ほとんどのハードウェアバックエンドはそうではない)、以前はバックエンドのプリミティブクラスが、バックエンドがサポートしている以上の回路を誤って送信してしまう可能性があった。 これは次のように修正された。BackendSamplerとBackendEstimatorが回路を複数のジョブに分割するように修正されました。 -
クラスの問題を修正しました。
BackendEstimatorクラスの問題を修正しました。以前、monitorという名前の実行オプションをTrueとして評価される値に設定すると、qiskit-ibmq-providerパッケージのバックエンドでのみ動作するジョブモニタが誤ってトリガされていました。 必要であれば、問題を起こすことなくmonitor。 -
メソッドで
Target.build_coupling_map()Noneメソッドの問題を修正しました。Targetオブジェクトで、理想的なグローバルに使用可能な命令と量子ビット制約を持つ命令が混在している場合に、このメソッドが誤って。 このような場合Target.build_coupling_map()は、制約された命令のカップリング・マップを返します(2量子ビット演算でない限り、グローバルには接続制約がないため、Noneを返します)。 8971を修正 -
属性で
Target.qargsNone属性の問題を修正しました。Targetオブジェクトに対して不正に。 -
のキーワード引数
pauli_listの早すぎる削除を修正しました。pauli_basis()関数のキーワード引数の削除が早すぎたため、Qiskit Terra 0.22.0 へのアップグレード時にpauli_list=True将来互換パスを使用している既存のコードが壊れていたのを修正しました。 このキーワード引数は関数に追加されたが、現在は非推奨であり、将来のリリースで削除される予定である。 -
QPYシリアライゼーション(
dump()) の問題が修正されました。ControlledGateサブクラスが_define()メソッドをオーバーロードして操作のカスタム定義を提供していた場合の問題を修正しました。 以前は、潜在的に_define()、定義を提供するメソッドを使用することを考慮していなかったため、このような操作の場合は正しくシリアライズされませんでした。 8794を修正 -
QPYのデシリアライズは、緩いインスタンスと緩いインスタンスの両方が回路にある場合、余分なインスタンスを追加しなくなった。
Clbitインスタンスを追加しない。Clbitが存在しQubitよりもClbits. -
QPYのデシリアライズは、入力回路にルースビットしか含まれていない場合、qとcという名前のレジスタを追加しなくなった。
-
を修正した。
SparsePauliOp.dot()メソッドを修正した。 これを解決するため、SparsePauliOpが取ることのできる dtype は、np.complex128とobjectに制限されている。 修正 #8992 -
関数と
circuit_drawer()関数とQuantumCircuit.draw()メソッドで、mpl出力に使用可能な組み込みスタイルがdefaultだけだった問題を修正した。iqxのような別の組み込みスタイルが使用された場合、スタイルが見つからないという警告が発せられ、ドロワーはdefaultスタイルを使用するようにフォールバックする。 8991を修正 -
の問題を修正しました。
transpile()TypeErrorで失敗していた問題を修正した。Targetオブジェクトがtarget引数で渡され、circuits引数に複数の回路のリストが指定された場合、 で失敗していた問題を修正しました。 -
の問題を修正しました。
transpile()の問題を修正した。Target(直接target引数経由か、 引数からBackendV2backendインスタンス)をターゲットにした場合の問題を修正しました。Measure命令(プロパティが定義されていない命令)を含む場合に発生する問題を修正しました。 これまでは、ターゲットを解析しようとすると例外が発生していた。 8969を修正 -
の問題を修正した。
VF2Layoutパスでエラーが発生する問題を修正した。Targetで実行するとエラーになる問題を修正しました。 これは修正され、エラーレートがない場合は理想的な実装として扱われ、エラーレートがない場合は最初にマッチしたレイアウトが選択されるようになった。 8970を修正 -
の問題を修正した。
VF2PostLayoutパスでエラーが発生する問題を修正した。Targetで実行するとエラーになる問題を修正しました。 このような場合、エラー率がないことが理想的な操作の実施として扱われる。 -
の問題を修正しました。
VQDk=2クラスの問題を修正しました。 以前は内部的な型の不一致で失敗していたが、現在は期待通りに実行される。 8982を修正 -
新しいプリミティブベースの変分アルゴリズムが、以下のようなパフォーマンス上のバグを修正した。
minimum_eigensolvers.VQE,eigensolvers.VQDおよびSamplingVQEがデフォルトでエネルギー評価をバッチ処理しなかったため、ハードウェア・バックエンドを使用した場合に大幅な速度低下を引き起こしていたパフォーマンスのバグを修正した。 -
ゼロオペランド・ゲートと命令は、以下のように動作するようになった。
circuit_to_gate(),QuantumCircuit.to_gate(),Gate.control()とOperatorからQuantumCircuitゼロ・オペランド命令を含む このエッジケースは、より大きな複合命令の一部としてグローバル・フェーズ・ゲートを作成する際に役立つことがあるが、多くの用途ではQuantumCircuit.global_phaseの方が適切かもしれない。 -
と
Statevector.evolve()とDensityMatrix.evolve()が非qubitサブシステムのネストされたサブシステムの進化に対して例外を発生させる問題を修正しました。 問題#8897を修正 -
のバグを修正。
Statevector.evolve()サブシステムの次元が異なる進化していないサブシステムが2つ以上ある場合に、サブシステムの進化が不正な値を返すというバグを修正しました。 問題#8899を修正
エア 0.11.1
バグ修正
-
CMake 3.18 またはそれ以降のバージョンを使用し、GPUサポートを有効にしてqiskit-aerをビルドしようとすると、ビルドエラーが発生する可能性があったのを修正しました。 CUDA でビルドする場合、CMake 3.18 以降では、
CMAKE_CUDA_ARCHITECTURESにターゲット GPU のアーキテクチャ値を設定する必要がありました。 これは、AER_CUDA_ARCHが設定されていない場合に使用されるように修正されました。 -
LocalNoisePassにおける clbits を含む命令の処理に関するバグを修正した。 以前は、method="append"の場合、ノイズが適用される命令(小節など)のclbitsを誤って消去していた。 -
Samplerクラスが複数の実行で同一の回路で実行された場合のパフォーマンスのオーバーヘッドを修正。 これは、後続の実行時にこれらの同一回路の転置をスキップ/キャッシュすることで達成された。
-
の互換性を修正。
SamplerおよびEstimatorプリミティブクラスと qiskit-terra 0.22.0 リリースとの互換性を修正しました。 qiskit-terra 0.22.0 では、 これらのクラスとの互換性を壊すような抽象インターフェイスへのAPI変更が行われました。SamplerとEstimatorが qiskit-terra >= 0.22.0 で使えるようになりました。
IBM Q プロバイダー 0.19.2
変更なし
0.39.0
このリリースでは、Qiskitメタパッケージの一部であるQiskit Aerプロジェクトも正式に非推奨となります。 これは、将来のリリースでは pip install qiskit に qiskit-aer が含まれなくなることを意味する。 もし現在、Aerを入手するために qiskit をインストールしたり依存関係としてリストアップしているのであれば、これをアップグレードして qiskit-aer も明示的にリストアップする必要があります。
qiskit-aer Qiskit メタパッケージ(つまり、 pip install qiskit を介してインストールされるもの)は、量子回路、プログラム、アプリケーションのビルドとコンパイルのための共通のコア機能のみを含み、その上に構築されるパッケージや、Qiskitをハードウェアやシミュレータにリンクするパッケージは別のパッケージであるというモデルに移行しています。
Terra 0.22.0
前奏曲
Qiskit Terra 0.22.0 リリースは、無数の新機能とバグ修正を含む主要機能リリースです。 今回のリリースのハイライトは以下の通り:
- 以下のような制御フロー命令を含むオブジェクトをトランスパイルするための初期サポートをトランスパイラに追加する。
QuantumCircuitのような制御フロー命令を含むForLoopOpそしてWhileLoopOp.- のスケーリングとパフォーマンスが大幅に改善された。
transpile()特にoptimization_level=3。- の外部プラグイン・インターフェイス。
transpile()の外部プラグインインターフェイスで、外部パッケージがデフォルトのパスマネージャ用のステージを実装できるようにします。 この件に関する詳細は以下を参照されたい。qiskit.transpiler.preset_passmanagers.plugin. さらにBackendV2バックエンドは、スケジューリングと翻訳段階で使用するカスタムデフォルトプラグインをオプションで設定できるようになりました。- のアルゴリズム実装を更新した。
qiskit.algorithmsのアルゴリズム実装を更新した。primitivesを実装するBaseSamplerそしてBaseEstimator.
新機能
-
可変の幅を持つ操作を表現するためのサポートを
Targetクラスに追加します。 以前はTargetオブジェクトのインスタンスは、ターゲットでサポートされている操作ごとにOperation。 これは、引数と操作のパラメーターの検証の両方に使われた。 しかし、可変幅を持つオペレーションでは、Operationクラスの各インスタンスは固定数の量子ビットしか持つことができないため、これは不可能だった。 バックエンドが可変幅の操作をサポートしている場合、インスタンスの代わりに操作のクラスで命令を追加することができる。 このような場合、操作はすべての量子ビットでグローバルにサポートされているものとして扱われる。 例えば、このようなターゲットを作る場合:from qiskit.circuit import Parameter, Measure, IfElseOp, ForLoopOp, WhileLoopOp from qiskit.circuit.library import IGate, RZGate, SXGate, XGate, CXGate from qiskit.transpiler import Target, InstructionProperties theta = Parameter("theta") ibm_target = Target() i_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(IGate(), i_props) rz_props = { (0,): InstructionProperties(duration=0, error=0), (1,): InstructionProperties(duration=0, error=0), (2,): InstructionProperties(duration=0, error=0), (3,): InstructionProperties(duration=0, error=0), (4,): InstructionProperties(duration=0, error=0), } ibm_target.add_instruction(RZGate(theta), rz_props) sx_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(SXGate(), sx_props) x_props = { (0,): InstructionProperties(duration=35.5e-9, error=0.000413), (1,): InstructionProperties(duration=35.5e-9, error=0.000502), (2,): InstructionProperties(duration=35.5e-9, error=0.0004003), (3,): InstructionProperties(duration=35.5e-9, error=0.000614), (4,): InstructionProperties(duration=35.5e-9, error=0.006149), } ibm_target.add_instruction(XGate(), x_props) cx_props = { (3, 4): InstructionProperties(duration=270.22e-9, error=0.00713), (4, 3): InstructionProperties(duration=305.77e-9, error=0.00713), (3, 1): InstructionProperties(duration=462.22e-9, error=0.00929), (1, 3): InstructionProperties(duration=497.77e-9, error=0.00929), (1, 2): InstructionProperties(duration=227.55e-9, error=0.00659), (2, 1): InstructionProperties(duration=263.11e-9, error=0.00659), (0, 1): InstructionProperties(duration=519.11e-9, error=0.01201), (1, 0): InstructionProperties(duration=554.66e-9, error=0.01201), } ibm_target.add_instruction(CXGate(), cx_props) measure_props = { (0,): InstructionProperties(duration=5.813e-6, error=0.0751), (1,): InstructionProperties(duration=5.813e-6, error=0.0225), (2,): InstructionProperties(duration=5.813e-6, error=0.0146), (3,): InstructionProperties(duration=5.813e-6, error=0.0215), (4,): InstructionProperties(duration=5.813e-6, error=0.0333), } ibm_target.add_instruction(Measure(), measure_props) ibm_target.add_instruction(IfElseOp, name="if_else") ibm_target.add_instruction(ForLoopOp, name="for_loop") ibm_target.add_instruction(WhileLoopOp, name="while_loop")その
IfElseOp,ForLoopOpおよびWhileLoopOp演算は、任意の数の量子ビットに対してグローバルにサポートされている。 これはTargetなどのAPI呼び出しに反映される。instruction_supported():ibm_target.instruction_supported(operation_class=WhileLoopOp, qargs=(0, 2, 3, 4)) ibm_target.instruction_supported('if_else', qargs=(0, 1))どちらも
Trueを返す。 -
新しいプリミティブ実装を追加、
BackendSamplerそしてBackendEstimatorを追加した。qiskit.primitives. これらの新しいプリミティブクラスの実装はBackendV1またはBackendV2インスタンスをBaseSamplerまたはBaseEstimatorとしてラップする。 これらのプリミティブ実装が意図する使用例は、ネイティブのプリミティブ実装を持たないプロバイダーと、プリミティブで動作するAPIを持つプロバイダーのバックエンドとのギャップを埋めることである。 例えばSamplingVQEクラスはBaseSamplerインスタンスを受け取ります。 このクラスを、ネイティブのプリミティブ実装を持たないプロバイダーのバックエンドで実行したい場合は、このクラスを実行するためにBackendSamplerを作ることができます:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import BackendSampler from qiskit.providers.fake_provider import FakeHanoi from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp backend = FakeHanoi() sampler = BackendSampler(backend=backend) operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalueネイティブのプリミティブ実装を持つプロバイダー(
qiskit-ibm-runtimeやqiskit-aerなど)を使用している場合は、常に、以下の代わりにネイティブのプリミティブ実装を使用することをお勧めします。BackendEstimatorまたはBackendSamplerの代わりに、そのネイティブ・プリミティブ実装を使用することをお勧めします。BackendEstimatorそしてBackendSamplerを返すバックエンドであれば、どのバックエンドでも動作するように設計されている。CountsResultsを返すどのバックエンドでも動作するように設計されている。 -
新しいアルゴリズム・クラスを追加、
AdaptVQEを追加しました。qiskit.algorithmsこのアルゴリズムはqiskit.algorithms.minimum_eigensolvers.VQEを構築するための演算子のプールと組み合わせて使用する。qiskit.circuit.library.EvolvedOperatorAnsatzを適応的に構築する。 例:from qiskit.algorithms.minimum_eigensolvers import AdaptVQE, VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.primitives import Estimator from qiskit.circuit.library import EvolvedOperatorAnsatz # get your Hamiltonian hamiltonian = ... # construct your ansatz ansatz = EvolvedOperatorAnsatz(...) vqe = VQE(Estimator(), ansatz, SLSQP()) adapt_vqe = AdaptVQE(vqe) result = adapt_vqe.compute_minimum_eigenvalue(hamiltonian) -
この
BackendV2クラスの一部としてカスタムコンパイルステップを注入できるようになりました。transpile()とgenerate_preset_pass_manager(). 実装にBackendV2実装にget_scheduling_stage_plugin()またはget_translation_stage_plugin()のメソッドが含まれている場合、トランスパイラーは返された文字列をscheduling_methodとtranslation_methodの引数のデフォルト値として使用します。 これにより、バックエンドは、トランスパイラステージpluginインターフェイスを活用することで、そのバックエンドをターゲットにしているときに追加のカスタムトランスパイラパスを実行できるようになります。 使い方の詳細については、こちらをご覧ください: カスタム・トランスパイラー・パスをご覧ください。 -
関数に新しいキーワード引数
ignore_backend_supplied_default_methodsを追加した。transpile()関数に新しいキーワード引数get_scheduling_stage_plugin()を追加しました。この引数は、対象のバックエンドで あるいはget_translation_stage_plugin()が定義されている場合に、バックエンドのデフォルトメソッドのカスタム選択を無効にするために使用できます。 -
labelクラスのコンストラクタとBarrierクラスのコンストラクタとbarrier()メソッドにパラメータを追加しました。Barrierディレクティブのインスタンスにラベルを割り当てることができるようになりました。 で生成されたビジュアライゼーションについてはcircuit_drawer()またはQuantumCircuit.draw()このラベルはbarrierの一番上に印刷されます。from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.h(1) circuit.barrier(label="After H") circuit.draw('mpl') -
新しいゲートを追加
CCZGate,CSGateおよびCSdgGateを回路ライブラリ(qiskit.circuit.library). -
追加
qiskit.algorithms.eigensolversパッケージが追加された。 この新しいモジュールは、最終的に以前のqiskit.algorithms.eigen_solversに取って代わることになる。 この新しいモジュールにはVQDの代替実装が含まれています。QuantumInstanceのインスタンスを取ります。BaseEstimatorを含むEstimator,BackendEstimatorやqiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダの実装が含まれます。例えば、新しい実装を
Estimatorクラスのインスタンスで新しい実装を使うにはfrom qiskit.algorithms.eigensolvers import VQD from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler, Estimator from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp h2_op = PauliSumOp(SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], )) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() fidelity = ComputeUncompute(Sampler()) vqd = VQD(estimator, fidelity, ansatz, optimizer, k=2) result = vqd.compute_eigenvalues(h2_op) eigenvalues = result.eigenvalues評価された補助演算子は、結果に対して
aux_operators_evaluated。 これは、プリミティブ実行のメタデータと同様に、これらの演算子の期待値を含むタプルのリストまたはdictで構成される。aux_operator_eigenvaluesはもはや有効なフィールドではない。 -
量子回路(パラメータ化可能)のペアに対する状態忠実度/オーバーラップを計算する新しいアルゴリズムを追加。 インターフェイスを定義する基底クラス(
BaseStateFidelityプリミティブ)のインスタンスを利用したcompute-uncomputeメソッドの実装がある。BaseSamplerプリミティブのインスタンスを利用するqiskit.algorithms.state_fidelities.ComputeUncompute.例:
import numpy as np from qiskit.primitives import Sampler from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.circuit.library import RealAmplitudes sampler = Sampler(...) fidelity = ComputeUncompute(sampler) circuit = RealAmplitudes(2) values = np.random.random(circuit.num_parameters) shift = np.ones_like(values) * 0.01 job = fidelity.run([circuit], [circuit], [values], [values+shift]) fidelities = job.result().fidelities -
新しいモジュール
qiskit.algorithms.gradientsで定義されたプリミティブ・インターフェースを使用してグラデーションを計算するために使用されるクラスが含まれています。qiskit.primitives. 勾配クラスには4つのタイプがある:有限差分、パラメータ・シフト、ユニタリーの線形結合、SPSA の4種類があり、実装は以下のインターフェイスのインスタンスを使用します。BaseEstimatorインターフェースのインスタンスを使用する実装を持つ:または
BaseSamplerインターフェースのインスタンスである:推定量ベースの勾配は期待値の勾配を計算し、サンプラーベースの勾配は測定結果の勾配(「確率勾配」とも呼ばれる)を返す。
例:
estimator = Estimator(...) gradient = ParamShiftEstimatorGradient(estimator) job = gradient.run(circuits, observables, parameters) gradients = job.result().gradients -
この
Groverクラスの新しいキーワード引数sampler。BaseSamplerインターフェイスのインスタンスを使用してアルゴリズムを実行し、結果を計算します。 この新しい引数は、quantum_instance引数に取って代わるものである。したがって、quantum_instanceは非推奨となり、今後のリリースでは非推奨となり、その後削除される予定である。例:
from qiskit import QuantumCircuit from qiskit.primitives import Sampler from qiskit.algorithms import Grover, AmplificationProblem sampler = Sampler() oracle = QuantumCircuit(2) oracle.cz(0, 1) problem = AmplificationProblem(oracle, is_good_state=["11"]) grover = Grover(sampler=sampler) result = grover.amplify(problem) -
新しいオプション、
"formatter.control.fill_waveform"がパルスドロワー(pulse_v2.draw()とSchedule.draw())スタイル・シートに追加されました。 このオプションを使用すると、出力可視化でパルスのフェイスカラーを取り除くことができ、パルスを線だけで描画できるようになります。例:
from qiskit.visualization.pulse_v2 import IQXStandard my_style = IQXStandard( **{"formatter.control.fill_waveform": False, "formatter.line_width.fill_waveform": 2} ) my_sched.draw(style=my_style) -
新しいトランスパイラー・パスを追加、
ResetAfterMeasureSimplificationこれはResetの後のMeasureを条件付きXGate. このパスは、次のようなバックエンドで使用できる。Reset演算を実行するバックエンドで使用することができます。Measureを削除します。Reset操作から重複を取り除くことができる。 例:from qiskit import QuantumCircuit from qiskit.transpiler.passes import ResetAfterMeasureSimplification qc = QuantumCircuit(1) qc.measure_all() qc.reset(0) qc.draw('mpl')result = ResetAfterMeasureSimplification()(qc) result.draw('mpl') -
回路クラスのコンストラクタの
entanglementキーワード引数に、サポートされる新しい値"reverse_linear"を追加。NLocalサーキット・クラスのコンストラクタに についてはTwoLocalのサブクラスである)回路では、、 を使用すると、 と同等のn量子ビット回路が得られる。NLocal)については、entanglement_blocks="cx"の場合、entanglement="reverse_linear"を使用すると、entanglement="full"と同等のn-qubit回路が得られるが、 のゲートのみとなる。CXGateゲートのみである。 -
ScheduleBlockは、未割り当てのサブルーチンを管理できるように、言い換えれば、他のプログラムを遅延呼び出しできるように更新された。 例えば、次のようなワークフローが可能になる:from qiskit import pulse with pulse.build() as prog: pulse.reference("x", "q0") with pulse.build() as xq0: pulse.play(Gaussian(160, 0.1, 40), pulse.DriveChannel(0)) prog.assign_references({("x", "q0"): xq0})これでユーザーは、リファレンス
("x", "q0")の実際の実装を知らなくても、progを作成し、後でそれを割り当てて実行することができる。 これにより、パルス・プログラムのモジュール性が向上し、他の校正に依存したテンプレート・パルス・プログラムを簡単に書くことができる。この機能を実現するために、新しいパルス命令(コンパイラ指令)が追加された。
Referenceが追加された。 コマンドが使用されると、この命令は現在のビルダースコープに注入される。reference()コマンドが使用されると、この命令は現在のビルダースコープに注入される。 現在のパルス・プログラムで定義されているすべての参照は、referencesプロパティで一覧表示できます。さらに、パラメータ管理を容易にするため、すべての参照はスコープで管理される。
scoped_parameters()そしてsearch_parameters()が追加された。ScheduleBlock. 詳細はAPIドキュメントを参照のこと。 -
新しいメソッド
SparsePauliOp.argsort()このメソッドは、係数によるソートとパウリによるソートの順に並べ替えの合成を返す。 メソッドにweightキーワード引数を使うことで、出力はさらにパウリに含まれる非同一項の数でソートすることができる。ここで、与えられた重みのすべてのパウリの集合は、やはり辞書順に並べられる。 -
新しいメソッド
SparsePauliOp.sort()このメソッドは、まずnumpyのargsort()を使って係数をソートし、次にPauliソートを優先します。 パウリソートが同じなら、係数でソートされる。weightキーワード引数を使うことで、出力はさらにパウリに含まれる非同一項の数でソートすることができる。 -
に新しいキーワード引数
wire_orderを追加。circuit_drawer()関数とQuantumCircuit.draw()メソッドに新しいキーワード引数 を追加しました。 例:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(4, "q") cr = ClassicalRegister(4, "c") cr2 = ClassicalRegister(2, "ca") circuit = QuantumCircuit(qr, cr, cr2) circuit.h(0) circuit.h(3) circuit.x(1) circuit.x(3).c_if(cr, 10) circuit.draw('mpl', cregbundle=False, wire_order=[2, 1, 3, 0, 6, 8, 9, 5, 4, 7]) -
のサポートを追加した。
CSGate,CSdgGateおよびCCZGateクラスのサポートを追加した。CNOTDihedral. 演算子を作成する際の入力回路はCNOTDihedral演算子がこれらのゲートを使った回路をサポートするようになった。 例:from qiskit import QuantumCircuit from qiskit.quantum_info import CNOTDihedral qc = QuantumCircuit(2) qc.t(0) qc.cs(0, 1) qc.tdg(0) operator = CNOTDihedral(qc) -
振幅推定アルゴリズムのクラス:
を実装したオブジェクトのインスタンスを取るコンストラクタに、
samplerという新しいキーワード引数が追加された。BaseSamplerインターフェースを実装するオブジェクトのインスタンスを取ります。BackendSamplerやSampler、qiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダの実装を含むインターフェイスを実装したオブジェクトのインスタンスを取ります。 これは、quantum_instance引数を使用してターゲットを設定する代わりに、次のような選択肢を提供します。BackendまたはQuantumInstanceを設定してアルゴリズムを実行する。 の使用は非推奨です。QuantumInstanceの使用は非推奨であり、将来のリリースでは非推奨となる予定です。 -
新しいクラスを追加しました、
BackendV2ConverterこれはBackendV1インスタンスをBackendV2インターフェイスでインスタンスをラップするために使用されます。 を持つことができる。BackendV2インスタンスを持つことができる。BackendV1. これにより、新しいインターフェイスのアクセスパターンを標準化することができる。BackendV2インターフェイスで標準化することができる。BackendV1. -
新しい関数
convert_to_target()この関数はBackendConfigurationオプションでBackendPropertiesとPulseDefaultsを受け取りTargetオブジェクトを生成するために使われる新しい関数を追加した。 -
qiskit.quantum_info.BaseOperatorサブクラス(たとえばScalarOp,SparsePauliOpおよびPauliListなど) は、組み込みの Pythonsum()関数で使用できるようになりました。 -
新しいトランスパイラー・パスが追加された、
ConvertConditionsToIfOpsが追加された。Instruction.c_if()-条件付き命令をIfElseOpオブジェクトに変換できる。 これは、バックエンドの旧タイプから新タイプへの移行を容易にするためである。 ほとんどのユーザーにとって、これをパスマネージャーに追加する必要はありませんし、プリセットのパスマネージャーにも含まれていません。 -
ゲート可換性解析をクラスにリファクタリング
CommutationChecker. このクラスは、(行列の乗算に基づき)2つのゲートが通るか通らないかをチェックし、その結果をキャッシュすることができます(将来、同様のチェックを行う際に行列の乗算が不要になります)。例えば、私たちは今、こうすることができる:
from qiskit.circuit import QuantumRegister, CommutationChecker comm_checker = CommutationChecker() qr = QuantumRegister(4) res = comm_checker.commute(CXGate(), [qr[1], qr[0]], [], CXGate(), [qr[1], qr[2]], [])2つのCXゲートは通約するので(最初のCXゲートは量子ビット
qr[1]とqr[0]、2番目のCXゲートは量子ビットqr[1]とqr[2])、resはTrueとなる。この可換性チェックは、条件付きゲートやパラメタライズドゲートに対しては過剰に保守的であり、そのようなゲートが可換であっても
False。 -
新しいトランスパイラー・パスを追加
CommutativeInverseCancellationを追加。ゲート間の整流関係を利用して逆ゲートのペアをキャンセルする。 このパスはトランスパイラ・パスの一般化である。InverseCancellationの一般化であり、より大きな逆ゲートの集合を検出し、可換性を考慮します。 このパスは、トランスパイラー・パスに関連するいくつかの問題も回避する。CommutativeCancellation.例:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager from qiskit.transpiler.passes import CommutativeInverseCancellation circuit = QuantumCircuit(2) circuit.z(0) circuit.x(1) circuit.cx(0, 1) circuit.z(0) circuit.x(1) passmanager = PassManager(CommutativeInverseCancellation()) new_circuit = passmanager.run(circuit)は、一対の自己逆Zゲートと一対の自己逆Xゲートをキャンセルし(該当するゲートはCXゲートとコミュートするため)、単一のCXゲートからなる回路を生成する。
逆チェックは、条件付きゲートやパラメータ化されたゲートに対して過剰に保守的であり、そのようなゲートのいくつかをキャンセルできない可能性がある。
-
QuantumCircuit.compose()は、基本回路が何も持っていない場合、古典的なビットを持つオペランドを受け付けるようになった。 量子だけの回路に計測を加えた回路を構成するパターンが成立するようになった。 例:from qiskit import QuantumCircuit base = QuantumCircuit(3) terminus = QuantumCircuit(3, 3) terminus.measure_all() # This will now succeed, though it was previously a CircuitError. base.compose(terminus) -
その
DAGCircuitメソッドdepth()とsize()recurseには、制御フロー演算を含む回路(たとえばIfElseOp,WhileLoopOpおよびForLoopOp). デフォルトではFalse、コントロール・フロー操作があるとエラーとなる。Trueに設定された場合、コンクリート走行の深さや大きさは一般的にわからないが、各コントロール・フロー・ブロックをその状態に応じて公平に重み付けしようとするプロキシ値が返される。 各コントロールフロー操作が出力にどのような影響を与えるかについては、各メソッドのドキュメントを参照のこと。 -
DAGCircuit.count_ops()コントロール・フロー・ブロックに再帰するためのrecurseキーワード引数を得た。 デフォルトではTrue、コントロール・フロー操作そのものだけでなく、全ブロックの全操作が返される。 -
関数に引数
create_preds_and_succsを追加circuit_to_dagdependency()とdag_to_dagdependency()から変換する関数QuantumCircuitとDAGCircuitをそれぞれDAGDependency.create_preds_and_succsの値が False の場合、ノードの遷移的な前任者と後任者は構築されない。DAGDependencyのノードに対する推移的な前任者と後任者は構築されないので、変換が高速になり、メモリ消費量も大幅に少なくなります。 のノードの直接の前任者と後任者は、通常通り構築される。DAGDependencyのノードの直接の前任者と後任者は通常通り構築される。例:
from qiskit.converters import circuit_to_dagdependency from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit circuit_in = QuantumCircuit(2) circuit_in.h(qr[0]) circuit_in.h(qr[1]) dag_dependency = circuit_to_dagdependency(circuit_in, create_preds_and_succs=False) -
新しい属性を追加
Clifford.symplectic_matrixClifford.tableau、Clifford.z,Clifford.x,Clifford.phase,Clifford.stab,Clifford.stab_z,Clifford.stab_x,Clifford.stab_phase,Clifford.destab,Clifford.destab_z,Clifford.destab_x,Clifford.destab_phaseをCliffordクラスに追加します。 これらはClifford.table、将来的には非推奨となる。StabilizerTableとPauliTableは非推奨であり、将来のリリースで非推奨となり、その後削除される予定である。 -
コンストラクタに
Commuting2qGateRouterコンストラクタに新しいキーワード引数edge_coloringが加わった。 この引数は、カップリング・マップのエッジ・カラーリングに使用され、コミューティング・ゲートの適用順序を決定する。 -
プリミティブを使って時間発展アルゴリズムを作成するための新しいアルゴリズム・インターフェースを追加した。
BaseSamplerそしてBaseEstimator. この新しいインターフェイスは以下のような構成になっている:この新しいインターフェイスは、以前からある時間発展アルゴリズム・インターフェイスに代わるもので、次のように定義されている。
EvolutionProblem,EvolutionResult,RealEvolverそしてImaginaryEvolverプリミティブの代わりにQuantumInstanceプリミティブの代わりに この新しいインターフェイスは以前のインターフェイスに取って代わるもので、いずれは非推奨となり、将来のリリースでは削除される予定である。 -
以下の新しいバックエンド・クラスを追加した。
qiskit.providers.fake_provider:これらの新しいクラスは
BackendV2インターフェイスを実装し、それぞれ IBM Quantum システムibm_auckland、ibm_oslo、ibm_geneva、ibm_perthシステムからのバックエンド情報の保存されたスナップショットを使用して作成されます。 -
この
Z2Symmetriesクラスには2つの新しいメソッドがある、convert_clifford()とtaper_clifford(). これらの2つのメソッドは、オブジェクトの Z2 対称性に基づいて演算子をテーパリングするために必要な2つの操作であり、以前は内部的にtaper()メソッドによって内部的に実行されていました。 しかし、これらのメソッドは現在、クラスのパブリック・メソッドとなっており、必要に応じて個別に呼び出すことができる。 -
によるロング・オブジェクトの活用の実行時のパフォーマンス。
PauliListオブジェクトをCliffordを使ったPauliList.evolve()の実行性能が大幅に向上した。 これで、以前よりかなり高速に動作するようになる。 -
新しい抽象クラス
ClassicalIOChannelをqiskit.pulse.channelsモジュールに追加しました。 このクラスは、古典的なI/Oチャンネルを表現するために使用され、これらのチャンネルを以下の他のサブクラスと区別します。Channel. この新しいクラスはMemorySlot,RegisterSlotおよびSnapshotChannelクラスの基本クラスとなる。 したがってpad()の正準化パルス変換はqiskit.pulse.transformsのどのインスタンスにも遅延は生じない。ClassicalIOChannel -
トランス
SabreSwapトランスパイラー・パスのコンストラクターには、新しいキーワード引数trialsがある。trials引数は、試行するランダムシード試行の回数を指定する。 SABREアルゴリズムからの出力は、乱数に使用されるシードによって大きく異なる可能性がある。SabreSwapは、trials個のランダムシードでアルゴリズムを実行し、(最もスワップの少ない)最良のものを選ぶ。trialsが指定されていない場合、パスはデフォルトでローカルシステムの物理CPU数を使用する。 -
トランス
SabreLayoutトランスパイラー・パスのコンストラクターには、新しいキーワード引数swap_trialsがある。swap_trials引数は、内部的に何回のランダムシード試行を実行するかを指定するために使用される。SabreSwapを指定する。 これは、trialsのパスの判定に相当する。SabreSwapパスに相当する。 設定されるとSabreSwapは内部的にswap_trials回実行される。swap_trialsが指定されていない場合、デフォルトでローカルシステムの物理CPU数を使用する。 -
新しい関数を追加、
estimate_observables()これはBaseEstimatorインターフェイスの実装を使用する新しい関数を追加した(例Estimator,BackendEstimatorまたはqiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダの実装)を使って、観測値のリストや辞書から期待値、平均値、標準偏差を計算する新しい関数を追加しました。 これは、既存の関数eval_observables()オブジェクトを使用して計算を行うQuantumInstanceオブジェクトを使用して計算を行う既存の関数と同様の目的を果たすもので、この新しい関数に取って代わられました(そして、今後のリリースでは非推奨となり、その後削除される予定です)。 -
新しい
Operationベース・クラスを追加しました。QuantumCircuit. これにより、"高レベル "のオブジェクトを回路上に直接保存することができる(例えば、次のようなオブジェクト)、Cliffordオブジェクト)、そのようなオブジェクトを直接組み合わせたり(例えば、同じ量子ビットに連続する複数のCliffordまた、実行時にそのようなオブジェクトを合成することもできます。Clifford例えば、深さを最適化したり、デバイスの接続性を利用したりする方法で合成する)。 以前はqiskit.circuit.InstructionのサブクラスだけがQuantumCircuitに置くことができたが、このインターフェースは扱いにくくなり、汎用オブジェクトにとってはメソッドや属性が多すぎる。新しい
Operationインターフェイスは、name、num_qubits、num_clbits(将来的には少し調整されるかもしれない)を含むが、重要なのは、definition(したがって、合成をオブジェクトに結びつけない)を含まないこと、condition(これは別の古典的な制御フローの一部であるべきである)を含まないこと、duration、unit(これらはトランスパイラの出力のプロパティであるため)を含まないことである。現在のところ、
Operation現在Gate,Reset,Barrier,Measureなどの "上位レベル "オブジェクトが含まれる。Clifford. この "上位レベル "オブジェクトのリストは、今後さらに増えていくだろう。 -
A
Cliffordとして量子回路に追加される。Operationとして量子回路に追加される。 実際の合成は、後のトランスパレーション・パスに延期される。HighLevelSynthesisに延期される。例えば、次のようなコードだ:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford qc = QuantumCircuit(3) cliff = random_clifford(2) qc.append(cliff, [0, 1])cliffに変換しなくなった。qiskit.circuit.Instructionqcこの変換には、クリフォードを回路に合成することも含まれます。 -
新しいトランスパイラー・パスを追加
OptimizeCliffordsを追加した。Cliffordオブジェクトを収集し、各ブロックを単一のClifford.例えば、次のようなコードだ:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler.passes import OptimizeCliffords from qiskit.transpiler import PassManager qc = QuantumCircuit(3) cliff1 = random_clifford(2) cliff2 = random_clifford(2) qc.append(cliff1, [2, 1]) qc.append(cliff2, [2, 1]) qc_optimized = PassManager(OptimizeCliffords()).run(qc)まず、2つのClifford
cliff1とcliff2を "上位 "オブジェクトとしてqcに格納し、次にトランスパイラ・パスがこの2つのCliffordを1つのCliffordに合成して回路を最適化する。OptimizeCliffordsは、これら2つのCliffordを1つのCliffordに合成することで、回路を最適化します。 結果のクリフォードは、より上位のオブジェクトとしてqc。 このパスはまだどのプリセットパスマネージャーにも含まれていない。 -
新しいトランスパイラー・パスを追加
HighLevelSynthesisを追加した、Cliffordオブジェクト)を合成する新しいトランスパイラ・パスを追加した。例えば、次のようなコードだ:
from qiskit import QuantumCircuit from qiskit.quantum_info import random_clifford from qiskit.transpiler import PassManager from qiskit.transpiler.passes import HighLevelSynthesis qc = QuantumCircuit(3) qc.h(0) cliff = random_clifford(2) qc.append(cliff, [0, 1]) qc_synthesized = PassManager(HighLevelSynthesis()).run(qc)は、デフォルトの
decompose_clifford()関数を使って、qcに格納されている上位レベルのクリフォードを合成する。この新しいトランスパイラー・パスは
HighLevelSynthesisはプリセット・パス・マネージャーに統合され、次のパスの直後に実行される。UnitarySynthesisパスの直後に実行されます。 したがってtranspile()は、回路に存在するすべての上位のCliffordを合成する。オブジェクトを "上位レベルのオブジェクト "として保存し
Cliffordオブジェクトを "上位レベル "オブジェクトとして保存し、これらのオブジェクトをHighLevelSynthesisパスを使ってこれらのオブジェクトをトランスパイルする作業は完全に透過的であるべきで、コードの変更は必要ない。 -
SparsePauliOpは、一般的な Python オブジェクトである係数配列で構築できるようになった。 これはParameterExpression他のオブジェクトでも動作しますが、ファーストクラスのサポートはありません。 いくつかのSparsePauliOp一部のメソッド(他のクラス表現への変換など)は、object配列を使用する場合、目的のターゲットがこれらの一般的な配列を表現できない場合、動作しないことがあります。例えば
ParameterExpressionSparsePauliOpは次のように組み立てられる:import numpy as np from qiskit.circuit import Parameter from qiskit.quantum_info import SparsePauliOp print(SparsePauliOp(["II", "XZ"], np.array([Parameter("a"), Parameter("b")])))これは
SparsePauliOp(['II', 'XZ'], coeffs=[ParameterExpression(1.0*a), ParameterExpression(1.0*b)]) -
新しい関数
plot_distribution()を追加した。 これはCounts、QuasiDistribution、ProbDistributionに適している。 生ディクトもパスできる。 例:from qiskit.visualization import plot_distribution quasi_dist = {'0': .98, '1': -.01} plot_distribution(quasi_dist) -
新しい高位合成プラグイン・インターフェースを導入し、外部パッケージに含まれる代替合成技術をトランスパイラ・パスとシームレスに使用できるようにした。
HighLevelSynthesisトランスパイラ・パスにシームレスに使用することができます。 これらの代替合成技法は、例えば、以下のような型の "上位レベル "オブジェクトに対して指定することができる。Operation例えばCliffordそしてLinearFunctionオブジェクトのように。 このプラグインのインターフェースは、ユニタリー合成のものと似ている。 後者の場合、新しいプラグインを書くための詳細はqiskit.transpiler.passes.synthesis.pluginモジュールのドキュメントにあります。 -
型の "上位レベル "オブジェクトの代替合成アルゴリズムを指定するために使用できる新しいクラス
HLSConfigを導入した。Operation. 関心のある上位レベルのオブジェクトごとに、オブジェクトHLSConfig、合成メソッドとその引数のリストを指定する。 このオブジェクトはHighLevelSynthesisに渡すか、hls_configのパラメータとして指定します。transpile().例として、
op_aとop_bは2つの上位オブジェクトの名前であり、op_a-オブジェクトは、追加パラメータを必要としない2つの合成メソッドdefaultと、2つのオプションの整数パラメータoption_1とoption_2を持つotherを持ち、op_b-オブジェクトは、1つの合成メソッドdefaultを持ち、qcは、op_aとop_bオブジェクトを含む量子回路であると仮定する。 次のコード・スニペット:hls_config = HLSConfig(op_b=[("other", {"option_1": 7, "option_2": 4})]) pm = PassManager([HighLevelSynthesis(hls_config=hls_config)]) transpiled_qc = pm.run(qc)は、
op_b-オブジェクトに対して代替合成メソッドotherを実行し、op_a-オブジェクトを含む他のすべての高レベルオブジェクトに対してdefaultメソッドを使用する方法を示している。 -
プリミティブを実行するための新しいメソッドを追加:
BaseSampler.run()そしてBaseEstimator.run(). これらのメソッドは非同期に実行されJobV1オブジェクトを返します。 これらの新しい実行メソッドはQuantumCircuitオブジェクト(およびBaseEstimator)を渡すことができます。 例:estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result()これは、以前の実行モデル(現在は非推奨)に代わるものである。
BaseSamplerとBaseEstimatorプリミティブがコンストラクタ経由ですべての入力を受け取り、それらの入力パラメータの組み合わせでプリミティブオブジェクトを呼び出して実行に使用するというものでした。 -
プリミティブの参照実装に
shotsオプションを追加。 乱数はseed_primitiveを与えることで修正できる。 例:from qiskit.primitives import Sampler from qiskit import QuantumCircuit bell = QuantumCircuit(2) bell.h(0) bell.cx(0, 1) bell.measure_all() with Sampler(circuits=[bell]) as sampler: result = sampler(circuits=[0], shots=1024, seed_primitive=15) print([q.binary_probabilities() for q in result.quasi_dists]) -
のコンストラクタは
BaseSamplerおよびBaseEstimatorプリミティブ・クラスのコンストラクタには、新しいオプションのキーワード引数optionsがあります。options属性を通じて公開されるオプションのデフォルト値を設定するために使用されます。 -
を追加した。
PVQDクラスを追加した。qiskit.algorithms. このクラスは投影された変分量子動力学(p-VQD)アルゴリズムを実装しています。各タイムステップにおいて、このアルゴリズムはトロッター式で次の状態を計算し、それを変分形式に投影する。 投影は、古典的な最適化ルーチンを用いて、トロッター進化した状態とアナザッツの忠実度を最大化することによって決定される。
import numpy as np from qiskit.algorithms.state_fidelities import ComputeUncompute from qiskit.algorithms.evolvers import EvolutionProblem from qiskit.algorithms.time_evolvers.pvqd import PVQD from qiskit.primitives import Estimator, Sampler from qiskit import BasicAer from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.algorithms.optimizers import L_BFGS_B sampler = Sampler() fidelity = ComputeUncompute(sampler) estimator = Estimator() hamiltonian = 0.1 * SparsePauliOp([Pauli("ZZ"), Pauli("IX"), Pauli("XI")]) observable = Pauli("ZZ") ansatz = EfficientSU2(2, reps=1) initial_parameters = np.zeros(ansatz.num_parameters) time = 1 optimizer = L_BFGS_B() # setup the algorithm pvqd = PVQD( fidelity, ansatz, initial_parameters, estimator, num_timesteps=100, optimizer=optimizer, ) # specify the evolution problem problem = EvolutionProblem( hamiltonian, time, aux_operators=[hamiltonian, observable] ) # and evolve! result = pvqd.evolve(problem) -
この
QNSPSA.get_fidelity()staticメソッドは、オプションでsampler。BaseSamplerインターフェイスの実装を提供するために使われます (Sampler,BackendSamplerまたはqiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダの実装)を提供するために使われる。QuantumCircuit. 例:from qiskit.primitives import Sampler from qiskit.algorithms.optimizers import QNSPSA fidelity = QNSPSA.get_fidelity(my_circuit, Sampler()) -
位相推定クラスのコンストラクタに新しいキーワード引数
samplerを追加:この引数は、以下のような
BaseSamplerインターフェイスの実装を提供する。Sampler,BackendSamplerなどのインターフェースの実装や、qiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダーの実装を提供するために使われる。例:
from qiskit.primitives import Sampler from qiskit.algorithms.phase_estimators import HamiltonianPhaseEstimation from qiskit.synthesis import MatrixExponential from qiskit.quantum_info import SparsePauliOp from qiskit.opflow import PauliSumOp sampler = Sampler() num_evaluation_qubits = 6 phase_est = HamiltonianPhaseEstimation( num_evaluation_qubits=num_evaluation_qubits, sampler=sampler ) hamiltonian = PauliSumOp(SparsePauliOp.from_list([("X", 0.5), ("Y", 0.6), ("I", 0.7)])) result = phase_est.estimate( hamiltonian=hamiltonian, state_preparation=None, evolution=MatrixExponential(), bound=1.05, ) -
トランスパイラー・パスは
SabreSwapトランスパイラー・パスは、アルゴリズムをRustで書き直したため、実行時のパフォーマンスが大幅に向上した。 -
シンボリック・パルス・サブクラス
Gaussian,GaussianSquare,DragおよびConstantは、サブクラスそのものではなく、SymbolicPulseをインスタンス化するようにアップグレードされました。 パルス・プログラムのパラメトリック・パルス・オブジェクトはすべてシンボリック・パルス・インスタンスでなければならない。 なお、SymbolicPulseは、SymbolicPulse.envelopeで定義された記号式オブジェクトで特定のエンベロープを一意に識別できる。 -
新しい関数を追加しました、
sampled_expectation_value()のような分布から対角作用素の期待値を計算することができます。CountsそしてQuasiDistribution. この関数で使用できる有効な演算子は次のとおりです:str,Pauli,PauliOp,PauliSumOpそしてSparsePauliOp. -
A
SamplingVQEクラスが導入され、対角ハミルトニアンに最適化され、samplerプリミティブを活用する。 AQAOASamplingVQEをサブクラスとするクラスも追加された。新しい
SamplingVQEを参照プリミティブで使うには、例えば次のようにする:from qiskit.algorithms.minimum_eigensolvers import SamplingVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Sampler from qiskit.opflow import PauliSumOp from qiskit.quantum_info import SparsePauliOp operator = PauliSumOp(SparsePauliOp(["ZZ", "IZ", "II"], coeffs=[1, -0.5, 0.12])) sampler = Sampler() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() sampling_vqe = SamplingVQE(sampler, ansatz, optimizer) result = sampling_vqe.compute_minimum_eigenvalue(operator) eigenvalue = result.eigenvalue評価された補助演算子は、結果に対して
aux_operators_evaluated。 これは、プリミティブ実行のメタデータと同様に、これらの演算子の期待値を含むタプルのリストまたはdictで構成される。aux_operator_eigenvaluesはもはや有効なフィールドではない。 -
メソッドに新しいキーワード引数
atolを追加。SparsePauliOp.equiv()メソッドに新しいキーワード引数を追加した、 -
トランスパイラ・ステージ用の新しいプラグイン・インターフェースを導入。
PassManagerオブジェクトを使用できるようにします。transpile()またはStagedPassManagerからの出力generate_preset_pass_manager(),level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()およびlevel_3_pass_manager(). ユーザーは、init_method、layout_method、routing_method、translation_method、optimization_method、scheduling_methodのキーワード引数で、トランスパイラ・ステージに使用するプラグインを選択できます。transpile()そしてgenerate_preset_pass_manager(). 現在インストールされているプラグイン名の完全なリストはlist_stage_plugins()関数で見ることができる。 プラグインの作成についてはqiskit.transpiler.preset_passmanagers.pluginモジュールのドキュメントを参照してください。 -
には2つの新しいキーワード引数がある。
transpile()には2つの新しいキーワード引数、init_methodとoptimization_methodがあり、それぞれinitステージとoptimizationステージで使用する代替プラグインを指定するのに使われる。 -
この
PassManagerConfigクラスには2つの新しい属性、init_methodとoptimization_methodがあり、コンストラクタ・メソッドのキーワード引数も一致しています。 これらは、コンパイルに使用するユーザー指定のinitとoptimizationプラグインを表す。 -
クラスが追加される。
SteppableOptimizerクラスが追加される。 を使って、古典的な最適化を段階的に行うことができる。step()メソッドを使って これらのオプティマイザは「ask and tell」インターフェースを実装しており、(オプションで)必要な関数や勾配の評価を手動で計算し、オプティマイザに差し戻すことができます。 このインターフェイスの詳細については、" ask and tell interface "を参照のこと。 ユーザーが最適化をステップ・バイ・ステップで行いたいと思うような非常に単純な使用例は、読み出しの場合である:import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): return (np.linalg.norm(x) - 1) ** 2 def grad(x): return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) for _ in range(maxiter): state = optimizer.state # Here you can manually read out anything from the optimizer state. optimizer.step() result = optimizer.create_result()もっと複雑なケースは、エラー処理だろう。 評価中の関数がランダムに失敗すると想像してほしい。 この場合、最適化プロセスを続ける前に、エラーをキャッチし、望ましい結果が得られるまで関数を再実行することができる。 この場合、"ask and tell "インターフェイスを使うことになる。
import random import numpy as np from qiskit.algorithms.optimizers import GradientDescent def objective(x): if random.choice([True, False]): return None else: return (np.linalg.norm(x) - 1) ** 2 def grad(x): if random.choice([True, False]): return None else: return 2 * (np.linalg.norm(x) - 1) * x / np.linalg.norm(x) initial_point = np.random.normal(0, 1, size=(100,)) optimizer = GradientDescent(maxiter=20) optimizer.start(x0=initial_point, fun=objective, jac=grad) while optimizer.continue_condition(): ask_data = optimizer.ask() evaluated_gradient = None while evaluated_gradient is None: evaluated_gradient = grad(ask_data.x_center) optimizer.state.njev += 1 optmizer.state.nit += 1 cf = TellData(eval_jac=evaluated_gradient) optimizer.tell(ask_data=ask_data, tell_data=tell_data) result = optimizer.create_result()のサブクラスとして
GradientDescentに移行した。SteppableOptimizer. -
subset_fitter。TensoredMeasFitterクラスに追加されます。 実装は、各クビットが個別に緩和される緩和パターン(例:[[0], [1], [2]])に限定される。 しかし、これは最も広く使われているケースである。 これによりTensoredMeasFitter物理量子ビットの番号順が古典ビットのインデックスと一致しない場合に使用できる。 -
最適化レベル0および1で、トランスパイラによる制御フロー操作がサポートされるようになった(例えば
transpile()またはgenerate_preset_pass_manager()をキーワード引数optimization_level=1で呼び出すなど)。 次のような回路を作ることができるfrom qiskit import QuantumCircuit qc = QuantumCircuit(2, 1) qc.h(0) qc.measure(0, 0) with qc.if_test((0, True)) as else_: qc.x(1) with else_: qc.y(1)というように、うまくトランスパイルする:
from qiskit import transpile from qiskit_aer import AerSimulator backend = AerSimulator(method="statevector") transpiled = transpile(qc, backend)キーワード引数
layout_methodで使用可能な値は、"trivial "と "dense "である。routing_methodでは、"stochastic "と "none "が利用できる。 翻訳(translation_method)は、"translator "または "unroller "を使って行うことができる。 最適化レベル2と3は、制御フローではまだサポートされていません。また、回路スケジューリング(つまり、scheduling_methodに値を提供すること)もサポートされていません。しかし、Qiskit Terraの今後のリリースで、これらやその他のレイアウト、配線、変換手法のサポートを拡張する予定です。あるバックエンドでコントロール・フロー操作によるトランパイルが成功するためには、そのバックエンドは、必要なコントロール・フロー操作をその基本として持っていなければならない。 例えば、Qiskit Aerがそうだ。 単にこのようなトランスパレーションを試してみたいのであれば、
basis_gatesの引数をオーバーライドすることを検討してほしい。transpile(). -
以下のトランスパイラ・パスは、すべて回路の中の命令という形でコントロール・フローを理解するように教えられている。
ControlFlowOp回路における命令レイアウト関連
ApplyLayoutDenseLayoutEnlargeWithAncillaFullAncillaAllocationSetLayoutTrivialLayoutVF2LayoutVF2PostLayout
ルーティング関連
翻訳関連の
BasisTranslatorContainsInstructionGatesInBasisUnitarySynthesisUnroll3qOrMoreUnrollCustomDefinitionsUnroller
最適化関連
BarrierBeforeFinalMeasurementsDepthFixedPointSizeOptimize1qGatesDecompositionCXCancellationRemoveResetInZeroState
これらのパスは、プリセットパスマネージャー(内部的に
transpile()とgenerate_preset_pass_manager()によって内部的に使用されるもの)を介して使用されるのが最も一般的ですが、他の用途にも使用できます。 これらのパスは、必要に応じてコントロールフロー操作に再帰し、内部ブロックを更新または分析する。 -
新しい
TrotterQRTEクラスを追加した。RealTimeEvolverインターフェイスを実装する新しいクラスを追加した。qiskit.primitives.BaseEstimatorを使用して計算を実行します。 この新しいクラスは、以前利用可能だったqiskit.algorithms.TrotterQRTEクラス(将来のリリースでは非推奨となり、その後削除される予定です)に取って代わるものです。BackendまたはQuantumInstance。 -
DAGCircuit.substitute_node_with_dag()はキーワード引数としてpropagate_condition。 これはデフォルトでTrue、以前の動作であり、置換されるノードのあらゆる条件を置換内のすべての操作ノードにコピーする。Falseに設定すると、条件はコピーされないので、条件ノードを、すでに条件を忠実に実装しているサブDAGに置き換えることができる。 -
DAGCircuit.substitute_node_with_dag()はシーケンスだけでなく、wiresパラメータにもマッピングを取ることができるようになった。 マッピングは、置換DAGのビットを、挿入されるDAGのビットにマッピングしなければならない。 これは、入力ノードが古典的なビットと条件の両方を持ち、置換DAGがこれらのビットを非順序で使用する可能性がある場合に、呼び出し側にとってより簡単な構築スタイルを可能にする。 -
を追加した。
qiskit.algorithms.minimum_eigensolversパッケージが追加され、プリミティブ対応アルゴリズムのインターフェースが追加された。VQEこの実装では、プリミティブを活用するためにリファクタリングされている。新しい実装をリファレンス・プリミティブで使うには、例えばこうする:
from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import TwoLocal from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp h2_op = SparsePauliOp( ["II", "IZ", "ZI", "ZZ", "XX"], coeffs=[ -1.052373245772859, 0.39793742484318045, -0.39793742484318045, -0.01128010425623538, 0.18093119978423156, ], ) estimator = Estimator() ansatz = TwoLocal(rotation_blocks=["ry", "rz"], entanglement_blocks="cz") optimizer = SLSQP() vqe = VQE(estimator, ansatz, optimizer) result = vqe.compute_minimum_eigenvalue(h2_op) eigenvalue = result.eigenvalue評価された補助演算子は、結果に対して
aux_operators_evaluated。 これは、プリミティブ実行のメタデータと同様に、これらの演算子の期待値を含むタプルのリストまたはdictで構成される。aux_operator_eigenvaluesはもはや有効なフィールドではない。
アップグレードの注意
-
オブジェクトの場合
Targetオブジェクトの場合、グローバルに定義された2量子ビット演算のみを含み、接続性の制約がない場合はTarget.build_coupling_map()メソッドからの返り値は、Noneとなります。CouplingMapnum_qubits、エッジを含まないオブジェクトを返します。 この変更は、バックエンドの実際の接続性制約をよりよく反映するために行われた。Targetによってモデル化されているバックエンドには接続制約がないからです。Target接続性の欠如ではありません。 何らかの理由で以前の動作を望むのであれば、例えば、Noneリターンをチェックし、手動でカップリング・マップを作成することで再現できる:from qiskit.transpiler import Target, CouplingMap from qiskit.circuit.library import CXGate target = Target(num_qubits=3) target.add_instruction(CXGate()) cmap = target.build_coupling_map() if cmap is None: cmap = CouplingMap() for i in range(target.num_qubits): cmap.add_physical_qubit(i) -
のコンストラクタの
entanglementキーワード引数のデフォルト値。RealAmplitudesおよびEfficientSU2クラスのコンストラクタのキーワード引数のデフォルト値が"full"から"reverse_linear"に変更されました。 この変更は、出力回路は同等だが、 の代わりに のみを使用しているためである。CXGateゲートを使用するためです。 以前のデフォルトを希望する場合は、どちらのコンストラクタを呼び出すときでも、entanglement="full"。 -
にバリデーション・チェックを追加した。
BaseSampler.run(). クラシック・ビットがない場合はエラーとなる。 -
パルスビルダー機能の
call()パルスビルダー機能がアップグレードされました。 このメソッドによってScheduleBlockインスタンスがこのメソッドによって呼び出されると、内部的に現在のコンテキストにReferenceを現在のコンテキストに作成し、呼び出されたプログラムを直ちにその参照に割り当てます。 従ってCall命令は生成されなくなった。 この変更に伴い、同じname引数で異なるブロックを呼び出すことは禁止された。 このような操作はエラーとなる。 -
Qiskit Terraの次のリリースである 0.23 から始まるほとんどのアーキテクチャでは、
tweedledumパッケージは必須ではなくオプションの依存関係になります。 これは現在、いくつかの古典的な位相オラクル関数で使用されている。 もしあなたのアプリケーションやライブラリーがこの機能を必要とするなら、すぐにパッケージの依存関係にtweedledum。tweedledumは、Qiskit Terra 0.22 の macOS arm64 ( M1 ) で即時適用され、要件ではなくなりました。 これは、このプラットフォーム用に提供されているホイールが壊れており、sdistからのビルドがほとんどの人にとって信頼できないからだ。 動作するバージョンのtweedledumを手動でインストールしても、依存する機能はすべて動作し続けます。 -
オブジェクトの
._layout。QuantumCircuitオブジェクトのLayoutinitial_layoutオブジェクトを格納することから、2つの属性を持つデータクラスを格納することに変更されました。Layoutオブジェクトを含むデータクラスを格納するように変更されました。input_qubit_mappingには、コンパイル時に設定される初期レイアウトのオブジェクトが格納され、 には、元の回路内の位置インデックスに量子ビットをマッピングする辞書が格納されます。 この変更は、トランスパイル後の回路が、どのような状況においても、最初のレイアウトによって引き起こされた順列を完全に逆転させることができるよう、すべての情報を提供するために必要であった。 この属性はプライベートであり、外部で使用されるべきではないが、初期レイアウトを追跡する唯一の方法である。transpile()を通して初期レイアウトを追跡する唯一の方法である。 Qiskit APIが対応していない_layout属性のユースケースをお持ちの場合は、この機能ギャップに対応できるよう、issueを開いてください。 -
のコンストラクタは
SetPhase,ShiftPhase,SetFrequencyおよびShiftFrequencyクラスのコンストラクタはPulseErrorを発生させるようになった。channel引数で渡された値がPulseChannelのインスタンスでない場合。 この変更は、コンストラクタへの入力が有効であることを確認するために行われた。 -
この
plot_histogram()関数が修正され、離散的なビン値の実際のヒストグラムを返すようになりました。 この関数の以前の動作は、名前とは裏腹に、実際に入力の分布の視覚化を生成していた。 この関数名と動作の不一致により、関数の動作が変更され、離散データの適切なヒストグラムが生成されるようになりました。 カウントデータの確率分布をプロットするという以前の動作を維持したい場合はplot_distribution()を利用して同等のグラフを生成することができる。 例えば、plot_histogram({'00': 512, '11': 500})の以前の動作は、次のようにして再現できる:from qiskit.visualization import plot_distribution import matplotlib.pyplot as plt ax = plt.subplot() plot_distribution({'00': 512, '11': 500}, ax=ax) ax.set_ylabel('Probabilities') -
qiskit.pulse.builderコンテキストinlineとpadは削除された。 これらはテラ 0.18.0 (2021年7月)で初めて非推奨となった。inlineの代わりとなるものはない。単にパルスをスコープに書き込むだけでよい。padコンテキスト・マネージャーは非推奨となったため、何の効果もない。 -
からの出力は
SabreSwapを呼び出す際にoptimization_level=3またはrouting_methodまたはlayout_methodが'sabre'に設定されている場合を含む)。transpile()を呼び出したときに または が設定された場合を含む)からの出力は、以前のリリースから変更される可能性があります。 の書き換えの一環として新しい乱数ジェネレーターが使用されたためである。SabreSwapパスの書き換えの一環として新しい乱数生成器が使用されたためである。 一貫性のある出力に依存する場合は、以前のバージョンのQiskitでパスを実行し、回路を保存してから現在のバージョンでロードするためにqiskit.qpyを利用して回路を保存し、現在のバージョンでロードすることができます。 -
この
Layout.add()physical_bitを指定しない場合の動作は、以前のリリースから変更されている。 以前のリリースでは、オブジェクトの長さに応じて新しい物理ビットが追加されていた。Layoutオブジェクトの長さに応じて 例えばLayoutを連続して呼び出すと、物理ビット2、4、5、6などが追加される。add()を連続して呼び出すと、物理ビット2、4、5、6などが追加される。 一方、物理ビットが2と3であった場合、連続した呼び出しは4、5、6、7......を追加することになる。 これは、以下のように変更された。Layout.add()に含まれる 0 から最大物理ビットの間に欠けている物理ビットを追加します。Layout. つまり、1と3の例では0、2、4、5が追加され、2と3の例では0、1、4、5が追加される。Layout. この変更は、結果の予測可能性を高めるためと、予期せぬ動作に起因するバグを修正するために行われた。 バックエンドの物理ビットは常に0から までの連続したシーケンスであるため、未使用の物理ビットがまだあるときに新しいビットを追加すると、レイアウトがバックエンドで使用可能なビット数よりも多くのビットを使用する可能性があります。 以前の動作を望む場合は、以下を呼び出す際に、目的の物理ビットを手動で指定することができます。Layout.add(). -
非推奨のメソッド
SparsePauliOp.table属性は削除されました。 もともとQiskit Terra 0.19 では非推奨だった。 代わりにpaulis()。 -
関数から
PauliTable。pauli_basis()関数から返すサポートは削除された。pauli_list同様にpauli_basis()関数の引数も削除された。PauliList(現在は唯一の戻り値)に切り替えるために使われていた関数の引数が削除された。 この機能はQiskit Terra 0.19 リリースで非推奨となりました。 -
偽のバックエンド・オブジェクト
FakeJohannesburg,FakeJohannesburgV2,FakeAlmaden,FakeAlmadenV2,FakeSingaporeおよびFakeSingaporeV2は、もはやパルス・デフォルトのペイロードを含まない。 つまりBackendV1ベースのクラスでは、BackendV1.defaults()メソッドとBackendV1.run()を使ったパルス・シミュレーションが利用できなくなります。 についてはBackendV2ベースのクラスでは、calibrationプロパティはTargetのプロパティは入力されなくなりました。 この変更は、これらのシステムがパラメータ・パルス定義の代わりにサンプリング波形を使用していたため、パルス・デフォルトのペイロード(合計 ~50MB )が非常に大きかったために行われた。 これら3つのペイロードファイルは、qiskit-terraのインストールに必要なディスク容量の50%以上を占めた。 パルスを意識したコンパイルや、これらの引退したデバイスのパルスシミュレーションが可能になる潜在的な価値と天秤にかけると、ファイルサイズはコストに見合わない。 これらのプロパティを活用する必要がある場合は、古いバージョンのQiskitを活用し、古いバージョンのqiskitから現在のリリースに回路を転送するためにqpyを利用して古いバージョンのqiskitから現在のリリースに回路を転送することができます。 -
isinstanceパルスクラスでチェックGaussian,GaussianSquare,DragとConstantのチェックは無効になります。これらの pulse サブクラスはインスタンス化されなくなったからです。 Terra 0.22、まだ使えますが、すぐに移行を始めてください。 型情報を使う代わりに、SymbolicPulse.pulse_type。 これはパルス・エンベロープの一意な文字列識別子であると仮定し、文字列の等号を使ってパルスの種類を調べることができる。 例:from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if isinstance(pulse, Gaussian): print("This is Gaussian pulse.")このコードは
from qiskit.pulse.library import Gaussian pulse = Gaussian(160, 0.1, 40) if pulse.pulse_type == "Gaussian": print("This is Gaussian pulse.")同じ理由で、
pulse.__class__.__name__のようなクラス属性は、パルス・タイプの情報を得るためにアクセスすべきではありません。 -
qiskit-terra 0.18.0 (2021年7月12日リリース) の非推奨通知により、例外
qiskit.exceptions.QiskitIndexErrorは削除され、もはや存在しません。 -
オプティマイザ・クラスのコンストラクタの非推奨引数
epsilonとfactrは削除された。L_BFGS_Bが削除されました。 これらの引数はもともと、 0.18.0 リリース(2021年7月12日リリース)の一部として非推奨となっていた。 代わりにftol引数を使用する必要があります。これらの引数の関係の詳細については、オプティマイザに関する scipyのドキュメントを参照してください。 -
レベル1とレベル2のプリセットパスマネージャーは、
optimization_level=1またはoptimization_level=2。transpile()またはgenerate_preset_pass_manager()とlevel_1_pass_manager()とlevel_2_pass_manager()からの出力時に使用されます。SabreLayoutとSabreSwapがデフォルトで使用されます。DenseLayoutとStochasticSwap. この変更は、トランスパイラの出力品質を向上させるために行われた。SabreLayoutとSabreSwapの組み合わせは、通常、出力回路に挿入されるSwapGateオブジェクトが出力回路に挿入されることが少なくなります。 以前のデフォルトパスを使いたい場合は、layout_method='dense'とrouting_method='stochastic'をtranspile()またはgenerate_preset_pass_manager()に設定してDenseLayoutとStochasticSwapに設定してください。 -
でデフォルトで
approximation_degree!=1.0を暗黙的に使用していた。transpile()optimization_level=3。 トランスパイラーは、デフォルトでは、片側順列変換や相似変換のような既知の変換まで、入力の単位性を保つべきである。 これは、approximation_degree=None、多くの時間ステップを持つトロッター化進化のような場合、ユニタリーが過度に近似され、不正確な結果につながるようなケースで、以前使用していた、不正確な結果につながっていた。 ユニタリー等価性を破る変換は、ユーザーによって明示的に有効化されるべきであると決定された。 合成されたUnitaryGate命令がターゲット・バックエンドのネイティブ命令のエラー率まで近似される以前のデフォルトの動作を望む場合は、approximation_degree=Noneを明示的に設定することができます。transpile()optimization_level=3を明示的に設定することができます:transpile(circuit, backend, approximation_degree=None, optimization_level=3) -
の最大許容関数評価数(
maxfun)のデフォルトを1000から15000に変更し、 のデフォルトと一致させる。L_BFGS_BSciPy のデフォルトを1000から15000に変更する。 この数値は、デフォルトの反復回数 (maxiter) とも一致する。 -
更新
ProbDistributionとQuasiDistributionを更新し、接頭辞 “0b” のないビット列が与えられた場合のビット数の情報を格納するようにした。ProbDistribution.binary_probabilities()そしてQuasiDistribution.binary_probabilities()保存されたビット数をビット数のデフォルト値として使用する。 -
RZXCalibrationBuilderとRZXCalibrationBuilderNoEchoは、予期せぬエラーでパスが終了するのを避けるため、非エコー交差共鳴(ECR)シーケンスによって実行されるストレッチングCXゲートをスキップするようにアップグレードされた。 これらのパスは新しい引数verbose。この引数は、この現象が発生したときにパスが警告を発するかどうかをコントロールする。verbose=Trueが設定されている場合、非ECRシーケンスがエンコードされると警告を発する。 -
視覚化モジュール
qiskit.visualizationは、内部的な再編成が行われた。 これはパブリック・インターフェースには影響しないはずだが、もし回路ドロワーの内部にアクセスしていたのであれば、異なる場所にあるかもしれない。 可視化モジュールのうちパブリックとみなされるのは、このオンライン・ドキュメントで文書化されているコンポーネントだけです。
非推奨のメモ
-
から直接、
Int1、Int2、classical_function、BooleanExpressionという名前をインポートすることは非推奨です。qiskit.circuitから直接インポートすることは非推奨です。 これは、tweedledumを完全な要件ではなく、オプションの依存事項とする動きの一環である。 代わりに、これらの名前をqiskit.circuit.classicalfunction. -
モジュール
qiskit.algorithms.factorizersとqiskit.algorithms.linear_solversは非推奨であり、将来のリリースで削除される予定です。 Qiskitテキストブックのチュートリアルに置き換わっています: ショー HHL -
random_stabilizer_table()は非推奨となり、将来のリリースで削除される予定です。 代わりにrandom_pauli_list()関数を使うべきである。 -
パルス・モジュール関数
qiskit.pulse.utils.deprecated_functionalityは非推奨であり、将来のリリースで削除される予定です。 これは主に内部だけの機能だった。 同じ機能はqiskit.utils.deprecate_functionで提供されている。 -
プリミティブの実行方法が変更されました。
BaseSampler.__call__()とBaseEstimator.__call__()メソッドは非推奨。 例:estimator = Estimator(...) result = estimator(circuits, observables, parameters) sampler = Sampler(...) result = sampler(circuits, observables, parameters)と書き換えるべきである
estimator = Estimator() result = estimator.run(circuits, observables, parameter_values).result() sampler = Sampler() result = sampler.run(circuits, parameter_values).result()プリミティブをコンテキスト・マネージャーとして使用することは非推奨です。 すべてのプリミティブでコンテキスト・マネージャが使えるわけではありません。 利用可能な場合(例:
qiskit-ibm-runtime)、セッションのコンテキストマネージャは同等の機能を提供する。circuitsコンストラクタのobservables、parametersは非推奨。circuitsとobservablesはrunメソッドから渡すことができる。runメソッドはparametersをサポートしていない。 パラメータ値のリゾートはユーザー自身が行う必要がある。 -
の未使用引数
qubit_channel_mapping。RZXCalibrationBuilderとRZXCalibrationBuilderNoEchoトランスパイラ・パスは非推奨となり、将来のリリースで削除される予定です。 この引数はもう使われず、パスの動作に影響を与えない。
バグ修正
-
と
Pauli.evolve()とPauliList.evolve()が、パウリの位相を変更する特定のクリフォード・ゲートによって進化させられると、dtypeエラーが発生する問題を修正した。 8438を修正 -
のバグを修正しました。
QuantumCircuit.initialize()とQuantumCircuit.prepare_state()のバグを修正し、初期化の引数としてQubitをひとつも受け付けないようにした。 -
メソッド
QuantumCircuit.while_loop()メソッドは古典的なビット参照を解決する。QuantumCircuit.if_test()とInstructionSet.c_if()と同じ方法で解決します。 -
その
DAGCircuitメソッドdepth(),size()とDAGCircuit.count_ops()メソッドは、回路に制御フローが存在する場合、以前はほとんど意味のない結果を黙って返していた。 そのdepth()とsize()メソッドはこのような場合に正しくエラーを投げるようになったが、プロキシ値の計算を可能にする新しいキーワード引数recurse。count_ops()はデフォルトでブロックに再帰し、その中の操作をカウントします。 -
の問題を修正しました。
DenseLayoutトランスパイラ・パスの問題を修正した。Qubitオブジェクト(つまりQuantumRegisterの一部ではない)がQuantumCircuitの一部であったルースオブジェクトがLayoutに含まれない問題を修正しました。 -
コンストラクタの
Operator.from_circuit()からのレイアウト出力を扱えるように、コンストラクタのメソッドが更新された。transpile()からのレイアウト出力を処理し、レイアウトによって引き起こされる量子ビットの並べ替えをすべてのケースで正しく反転できるように、コンストラクタのメソッドが更新されました。 以前は、トランスパイルサーキットがルーズなオブジェクトを使用していた場合Qubitオブジェクト、複数のQuantumRegisterオブジェクト、または単一のQuantumRegister"q"を使用していた場合、コンストラクタは回路からOperatorを作成できませんでした。 #8800を修正。 -
量子ゲートを1つ含む量子ビットと古典ビットを1つずつ持つ命令の分解に失敗するバグを修正。 これで次のように分解される:
block = QuantumCircuit(1, 1) block.h(0) circuit = QuantumCircuit(1, 1) circuit.append(block, [0], [0]) decomposed = circuit.decompose() -
の空のシンプレクティック行列の初期化を修正しました。
from_symplectic()のPauliListクラスのfrom qiskit.quantum_info.operators import PauliList x = np.array([], dtype=bool).reshape((1,0)) z = np.array([], dtype=bool).reshape((1,0)) pauli_list = PauliList.from_symplectic(x, z) -
のトランスパイラ・パスの問題を修正。
GateDirectionのトランスパイラ・パスの問題を修正した。CZGate. CZゲートは対称であるため、量子ビットの引数を反転させることで有向結合マップを一致させることができる。 -
回路サンプラーをコール間で再利用し、ネストされたパラメータをバインドする際の
DerivativeBase.gradient_wrapper()メソッドの問題を修正。 -
mplおよびlatexの回路ドロワーにおいて、回路内にbarrierがある場合にidle_wiresオプションを False に設定すると、ドロワーが故障する問題が修正された。 8313を修正 -
問題を修正しました
circuit_drawer()そしてQuantumCircuit.draw()とlatex方法OSError一時ディレクトリ( *例えば */tmp) は作業ディレクトリとは異なるファイルシステム上にあります。 8542を修正 -
ネスト
FlowControllerの中に別のPassManagerの中に入れ子にすると、以前はトランスパイラのパスの一部が、トランスパイル中に "忘れ去られる "ことがありました。DAGCircuitを返していた場合、トランスパイル中に一部のパスが "忘れ去られる "ことがありました。 入れ子のFlowControllerが正しく転置に影響するようになった。 -
比較
QuantumCircuitとDAGCircuitを等しいかどうか比較することは、以前は、回路が同じ型の複数のレジスタを含む場合 (例えば、 2つ以上のQuantumRegisters)、レジスタが同一でもFalse。 複数のレジスタを持つ回路を正しく比較できるようになりました。 -
OpenQASM 2 エクスポーター(
QuantumCircuit.qasm())は、定義されたすべての量子ビットに影響を与えないUnitaryGateを正しく定義するようになりました。 修正 #8224。 -
text、サーキットドロワーに2つのバグがあり、修正された。 これらは、vertical_compressionがデフォルトのmediumに設定されている場合に表示される。 前者はテキストが他のテキストやゲートを上書きしてしまうことがあり、後者はゲートとそのコントロールの接続が切れてしまうことがあった。 8588を参照。 -
の問題を修正した。
UnitarySynthesisパスの問題を修正した。Target入力を持つ回路が期待通りに処理されずに失敗することがあった問題を修正した。 -
トランスパイラーの
GateDirectionトランスパイラ・パスは、パラメータ化されたゲートをTarget. -
オプティマイザー・クラスで
SNOBFITメソッドの実行中に内部エラーが発生する問題を修正しました。minimize()メソッドの実行中に内部エラーが発生する問題を修正しました。 これはコール時にチェックされ、必要なバウンズがコールにない場合、ValueError。minimize()を素早く発生させる。 8580を修正 -
のメソッドから出力される callable の問題を修正しました。
get_energy_evaluation()メソッドから出力されるVQDクラスのメソッドからの出力 callable が、実行時に指定されたcallbackを正しく呼び出すようになりました。 以前はこの場合、コールバックは正しく使用されなかった。 8575を修正 -
クラシックビットのない回路で
circuit_drawer()をreverse_bits=Trueとともに使用した場合に、cregbundleに関する警告が発せられ混乱する可能性があった問題を修正。 修正 #8690 -
OpenQASM 3 エクスポーター (
qiskit.qasm3) は、 OpenQASM のビルトイン (resetやmeasureなど) を正しく処理するようになりました。c_if(). これまでは無視されていた。 -
クラスの問題を修正しました。
SPSAクラスが内部的にジョブを偶数サイズのバッチにまとめようとしていた問題を修正しました。 この問題は修正され、ジョブが均等なサイズでない場合でも、常に正常にバッチ処理されるようになった。 -
の動作を修正。
Layout.add()の動作が修正されました。transpile()の出力が無効となり、ターゲットバックエンドで利用可能な Qubits よりも多くの Qubits が含まれる可能性があった挙動を修正しました。 修正しました: #8667 -
state_to_latex()関数のオプション引数prefixにラテックス文字列を渡すとエラーになる問題を修正。 8460を修正 -
関数
state_to_latex()は、ゼロに近い値が存在する場合に有効な LaTeX を生成しないため、state_drawer()を呼び出すとエラーになる。 8169を修正。 -
GradientDescentは反復回数、関数評価回数、勾配評価回数を正しくカウントするようになった。 また、勾配は順方向有限差分法で近似されることがドキュメントに正しく記載されるようになりました。 -
の非推奨警告を修正。
NaturalGradientnormalizeパラメータがTrueに設定されている場合、モデルをフィットする前にStandardScalerを使用してデータをスケーリングするようになりました。
エア 0.11.0
変更なし
IBM Q プロバイダー 0.19.2
変更なし