Skip to main content
IBM Quantum Platform

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 を修正。

  • プリミティブの問題を修正しました、 SamplerEstimatornumpy.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_method would wrap the unbound function associated with the classmethod and then fail when invoked because the class object usually bound to the classmethod was 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

  • BackendV2 ReadoutError オブジェクトを持つ が、ゲート以外の命令では過剰な s を持つノイズモデルを生成する可能性があるバグを修正しました。 NoiseModel.from_backend() QuantumError このコミットでは、 NoiseModel.from_backend()BackendV2 オブジェクトで更新し、対応する BackendV1 オブジェクトで呼び出されたものと同じノイズモデルを返すようにした。 つまり、結果として得られるノイズモデルには、測定値に関する QuantumError sは含まれず、リセットなど他の非ゲート命令に関する熱緩和エラーのみが含まれる可能性がある。 なお、小節にはまだ ReadoutError sが含まれている。

  • NoiseModel.from_backend() で、 temperature kwarg をデフォルト以外の値で使用すると、指定された温度の励起状態ポピュレーションが正しく計算されないバグを修正。 以前は、ボルツマン分布の計算に係数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 が指定されていない場合でも、実行のたびに同じ結果が返されていた。

  • プリミティブクラスの問題を修正しました、 BackendSamplerBackendEstimatorインスタンスを pickle でシリアライズできない問題を修正した。 一般に、これらのクラスは BackendV2 そして BackendV1 インスタンスはシリアライズ可能である必要はありません(多くの場合そうではありません)が BackendSamplerBackendEstimator のクラス定義は、もはや 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 を初めて公式にサポートした。

バグ修正

  • バックエンドのプリミティブ・クラスの問題を修正しました。 BackendSamplerBackendEstimator インスタンスで実行できない問題を修正した。 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_list kwarg は 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を修正

  • の等号チェッカーは QuantumCircuitDAGCircuit (同じ型のオブジェクトとの)等号チェッカーはシングルビットの条件を正しく処理するようになった。 以前は、ビットが回路命令の他の特性が得る「意味的」チェックではなく、「厳密な」等号チェックを使用するため、等号の誤検出が発生していた。

  • におけるクラシック・ビットの取り扱いを修正した。 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 の問題を修正しました。 すべてのバックエンドが無制限のバッチサイズをサポートしているわけではなく(ほとんどのハードウェアバックエンドはそうではない)、以前はバックエンドのプリミティブクラスが、バックエンドがサポートしている以上の回路を誤って送信してしまう可能性があった。 これは次のように修正された。 BackendSamplerBackendEstimator が回路を複数のジョブに分割するように修正されました。

  • クラスの問題を修正しました。 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.complex128object に制限されている。 修正 #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変更が行われました。 SamplerEstimator が qiskit-terra >= 0.22.0 で使えるようになりました。

IBM Q プロバイダー 0.19.2

変更なし


0.39.0

このリリースでは、Qiskitメタパッケージの一部であるQiskit Aerプロジェクトも正式に非推奨となります。 これは、将来のリリースでは pip install qiskitqiskit-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-runtimeqiskit-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_methodtranslation_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, BackendEstimatorqiskit-ibm-runtimeqiskit-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 クラスの新しいキーワード引数 samplerBaseSampler インターフェイスのインスタンスを使用してアルゴリズムを実行し、結果を計算します。 この新しい引数は、 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回路が得られるが、 n1n-1 のゲートのみとなる。 CXGaten(n1)2\frac{n(n-1)}{2} ゲートのみである。

  • 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 インターフェースを実装するオブジェクトのインスタンスを取ります。 BackendSamplerSampler、qiskit-ibm-runtimeやqiskit-aerにあるようなプロバイダの実装を含むインターフェイスを実装したオブジェクトのインスタンスを取ります。 これは、 quantum_instance 引数を使用してターゲットを設定する代わりに、次のような選択肢を提供します。 Backend または QuantumInstance を設定してアルゴリズムを実行する。 の使用は非推奨です。 QuantumInstance の使用は非推奨であり、将来のリリースでは非推奨となる予定です。

  • 新しいクラスを追加しました、 BackendV2Converterこれは BackendV1 インスタンスを BackendV2 インターフェイスでインスタンスをラップするために使用されます。 を持つことができる。 BackendV2 インスタンスを持つことができる。 BackendV1. これにより、新しいインターフェイスのアクセスパターンを標準化することができる。 BackendV2 インターフェイスで標準化することができる。 BackendV1.

  • 新しい関数 convert_to_target() この関数は BackendConfigurationオプションで BackendPropertiesPulseDefaults を受け取り Target オブジェクトを生成するために使われる新しい関数を追加した。

  • qiskit.quantum_info.BaseOperator サブクラス(たとえば ScalarOp, SparsePauliOp および PauliListなど) は、組み込みの Python sum() 関数で使用できるようになりました。

  • 新しいトランスパイラー・パスが追加された、 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] )、 resTrue となる。

    この可換性チェックは、条件付きゲートやパラメタライズドゲートに対しては過剰に保守的であり、そのようなゲートが可換であっても 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() から変換する関数 QuantumCircuitDAGCircuitをそれぞれ 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.tableauClifford.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_phaseClifford クラスに追加します。 これらは Clifford.table、将来的には非推奨となる。 StabilizerTablePauliTable は非推奨であり、将来のリリースで非推奨となり、その後削除される予定である。

  • コンストラクタに Commuting2qGateRouter コンストラクタに新しいキーワード引数 edge_coloring が加わった。 この引数は、カップリング・マップのエッジ・カラーリングに使用され、コミューティング・ゲートの適用順序を決定する。

  • プリミティブを使って時間発展アルゴリズムを作成するための新しいアルゴリズム・インターフェースを追加した。 BaseSampler そして BaseEstimator. この新しいインターフェイスは以下のような構成になっている:

    この新しいインターフェイスは、以前からある時間発展アルゴリズム・インターフェイスに代わるもので、次のように定義されている。 EvolutionProblem, EvolutionResult, RealEvolverそして ImaginaryEvolver プリミティブの代わりに QuantumInstance プリミティブの代わりに この新しいインターフェイスは以前のインターフェイスに取って代わるもので、いずれは非推奨となり、将来のリリースでは削除される予定である。

  • 以下の新しいバックエンド・クラスを追加した。 qiskit.providers.fake_provider:

    これらの新しいクラスは BackendV2 インターフェイスを実装し、それぞれ IBM Quantum システム ibm_aucklandibm_osloibm_genevaibm_perth システムからのバックエンド情報の保存されたスナップショットを使用して作成されます。

  • この Z2Symmetries クラスには2つの新しいメソッドがある、 convert_clifford()taper_clifford(). これらの2つのメソッドは、オブジェクトの Z2 対称性に基づいて演算子をテーパリングするために必要な2つの操作であり、以前は内部的に taper() メソッドによって内部的に実行されていました。 しかし、これらのメソッドは現在、クラスのパブリック・メソッドとなっており、必要に応じて個別に呼び出すことができる。

  • によるロング・オブジェクトの活用の実行時のパフォーマンス。 PauliList オブジェクトを Clifford を使った PauliList.evolve() の実行性能が大幅に向上した。 これで、以前よりかなり高速に動作するようになる。

  • 新しい抽象クラス ClassicalIOChannelqiskit.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-runtimeqiskit-aer にあるようなプロバイダの実装)を使って、観測値のリストや辞書から期待値、平均値、標準偏差を計算する新しい関数を追加しました。 これは、既存の関数 eval_observables() オブジェクトを使用して計算を行う QuantumInstance オブジェクトを使用して計算を行う既存の関数と同様の目的を果たすもので、この新しい関数に取って代わられました(そして、今後のリリースでは非推奨となり、その後削除される予定です)。

  • 新しい Operation ベース・クラスを追加しました。 QuantumCircuit. これにより、"高レベル "のオブジェクトを回路上に直接保存することができる(例えば、次のようなオブジェクト)、 Clifford オブジェクト)、そのようなオブジェクトを直接組み合わせたり(例えば、同じ量子ビットに連続する複数の Clifford また、実行時にそのようなオブジェクトを合成することもできます。 Clifford 例えば、深さを最適化したり、デバイスの接続性を利用したりする方法で合成する)。 以前は qiskit.circuit.Instruction のサブクラスだけが QuantumCircuitに置くことができたが、このインターフェースは扱いにくくなり、汎用オブジェクトにとってはメソッドや属性が多すぎる。

    新しい Operation インターフェイスは、 namenum_qubitsnum_clbits (将来的には少し調整されるかもしれない)を含むが、重要なのは、 definition (したがって、合成をオブジェクトに結びつけない)を含まないこと、 condition (これは別の古典的な制御フローの一部であるべきである)を含まないこと、 durationunit (これらはトランスパイラの出力のプロパティであるため)を含まないことである。

    現在のところ、 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 cliff1cliff2 を "上位 "オブジェクトとして 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() を追加した。 これは CountsQuasiDistributionProbDistribution に適している。 生ディクトもパスできる。 例:

    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_aop_b は2つの上位オブジェクトの名前であり、 op_a-オブジェクトは、追加パラメータを必要としない2つの合成メソッド default と、2つのオプションの整数パラメータ option_1option_2 を持つ other を持ち、 op_b-オブジェクトは、1つの合成メソッド default を持ち、 qc は、 op_aop_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()

    これは、以前の実行モデル(現在は非推奨)に代わるものである。 BaseSamplerBaseEstimator プリミティブがコンストラクタ経由ですべての入力を受け取り、それらの入力パラメータの組み合わせでプリミティブオブジェクトを呼び出して実行に使用するというものでした。

  • プリミティブの参照実装に 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メソッドは、オプションで samplerBaseSampler インターフェイスの実装を提供するために使われます ( Sampler, BackendSamplerまたは qiskit-ibm-runtimeqiskit-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-runtimeqiskit-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 プリミティブを活用する。 A QAOASamplingVQE をサブクラスとするクラスも追加された。

    新しい 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_methodlayout_methodrouting_methodtranslation_methodoptimization_methodscheduling_method のキーワード引数で、トランスパイラ・ステージに使用するプラグインを選択できます。 transpile() そして generate_preset_pass_manager(). 現在インストールされているプラグイン名の完全なリストは list_stage_plugins() 関数で見ることができる。 プラグインの作成については qiskit.transpiler.preset_passmanagers.plugin モジュールのドキュメントを参照してください。

  • には2つの新しいキーワード引数がある。 transpile() には2つの新しいキーワード引数、 init_methodoptimization_method があり、それぞれ init ステージと optimization ステージで使用する代替プラグインを指定するのに使われる。

  • この PassManagerConfig クラスには2つの新しい属性、 init_methodoptimization_method があり、コンストラクタ・メソッドのキーワード引数も一致しています。 これらは、コンパイルに使用するユーザー指定の initoptimization プラグインを表す。

  • クラスが追加される。 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_fitterTensoredMeasFitter クラスに追加されます。 実装は、各クビットが個別に緩和される緩和パターン(例: [[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 回路における命令


    レイアウト関連


    ルーティング関連


    翻訳関連の


    最適化関連

    これらのパスは、プリセットパスマネージャー(内部的に 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" に変更されました。 この変更は、出力回路は同等だが、 n(n1)2\frac{n(n-1)}{2} の代わりに n1n-1 のみを使用しているためである。 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 を手動でインストールしても、依存する機能はすべて動作し続けます。

  • オブジェクトの ._layoutQuantumCircuit オブジェクトの 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 コンテキスト inlinepad は削除された。 これらはテラ 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から nn までの連続したシーケンスであるため、未使用の物理ビットがまだあるときに新しいビットを追加すると、レイアウトがバックエンドで使用可能なビット数よりも多くのビットを使用する可能性があります。 以前の動作を望む場合は、以下を呼び出す際に、目的の物理ビットを手動で指定することができます。 Layout.add().

  • 非推奨のメソッド SparsePauliOp.table 属性は削除されました。 もともとQiskit Terra 0.19 では非推奨だった。 代わりに paulis()

  • 関数から PauliTablepauli_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, DragConstant のチェックは無効になります。これらの 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 は削除され、もはや存在しません。

  • オプティマイザ・クラスのコンストラクタの非推奨引数 epsilonfactr は削除された。 L_BFGS_B が削除されました。 これらの引数はもともと、 0.18.0 リリース(2021年7月12日リリース)の一部として非推奨となっていた。 代わりに ftol 引数を使用する必要があります。これらの引数の関係の詳細については、オプティマイザに関する scipyのドキュメントを参照してください。

  • レベル1とレベル2のプリセットパスマネージャーは、 optimization_level=1 または optimization_level=2transpile() または generate_preset_pass_manager()level_1_pass_manager()level_2_pass_manager()からの出力時に使用されます。 SabreLayoutSabreSwap がデフォルトで使用されます。 DenseLayoutStochasticSwap. この変更は、トランスパイラの出力品質を向上させるために行われた。 SabreLayoutSabreSwap の組み合わせは、通常、出力回路に挿入される SwapGate オブジェクトが出力回路に挿入されることが少なくなります。 以前のデフォルトパスを使いたい場合は、 layout_method='dense'routing_method='stochastic'transpile() または generate_preset_pass_manager() に設定して DenseLayoutStochasticSwap に設定してください。

  • でデフォルトで 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) とも一致する。

  • 更新 ProbDistributionQuasiDistribution を更新し、接頭辞 “0b” のないビット列が与えられた場合のビット数の情報を格納するようにした。 ProbDistribution.binary_probabilities() そして QuasiDistribution.binary_probabilities() 保存されたビット数をビット数のデフォルト値として使用する。

  • RZXCalibrationBuilderRZXCalibrationBuilderNoEcho は、予期せぬエラーでパスが終了するのを避けるため、非エコー交差共鳴(ECR)シーケンスによって実行されるストレッチングCXゲートをスキップするようにアップグレードされた。 これらのパスは新しい引数 verbose 。この引数は、この現象が発生したときにパスが警告を発するかどうかをコントロールする。 verbose=True が設定されている場合、非ECRシーケンスがエンコードされると警告を発する。

  • 視覚化モジュール qiskit.visualization は、内部的な再編成が行われた。 これはパブリック・インターフェースには影響しないはずだが、もし回路ドロワーの内部にアクセスしていたのであれば、異なる場所にあるかもしれない。 可視化モジュールのうちパブリックとみなされるのは、このオンライン・ドキュメントで文書化されているコンポーネントだけです。

非推奨のメモ

  • から直接、 Int1Int2classical_functionBooleanExpression という名前をインポートすることは非推奨です。 qiskit.circuit から直接インポートすることは非推奨です。 これは、 tweedledum を完全な要件ではなく、オプションの依存事項とする動きの一環である。 代わりに、これらの名前を qiskit.circuit.classicalfunction.

  • モジュール qiskit.algorithms.factorizersqiskit.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コンストラクタの observablesparameters は非推奨。 circuitsobservablesrun メソッドから渡すことができる。 run メソッドは parameters をサポートしていない。 パラメータ値のリゾートはユーザー自身が行う必要がある。

  • の未使用引数 qubit_channel_mappingRZXCalibrationBuilderRZXCalibrationBuilderNoEcho トランスパイラ・パスは非推奨となり、将来のリリースで削除される予定です。 この引数はもう使われず、パスの動作に影響を与えない。

バグ修正

  • 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() メソッドはこのような場合に正しくエラーを投げるようになったが、プロキシ値の計算を可能にする新しいキーワード引数 recursecount_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が正しく転置に影響するようになった。

  • 比較 QuantumCircuitDAGCircuitを等しいかどうか比較することは、以前は、回路が同じ型の複数のレジスタを含む場合 (例えば、 2つ以上の QuantumRegisters)、レジスタが同一でも False 。 複数のレジスタを持つ回路を正しく比較できるようになりました。

  • OpenQASM 2 エクスポーター(QuantumCircuit.qasm())は、定義されたすべての量子ビットに影響を与えない UnitaryGate を正しく定義するようになりました。 修正 #8224

  • text 、サーキットドロワーに2つのバグがあり、修正された。 これらは、 vertical_compression がデフォルトの medium に設定されている場合に表示される。 前者はテキストが他のテキストやゲートを上書きしてしまうことがあり、後者はゲートとそのコントロールの接続が切れてしまうことがあった。 8588を参照。

  • の問題を修正した。 UnitarySynthesis パスの問題を修正した。 Target 入力を持つ回路が期待通りに処理されずに失敗することがあった問題を修正した。

  • トランスパイラーの GateDirection トランスパイラ・パスは、パラメータ化されたゲートを Target.

  • オプティマイザー・クラスで SNOBFIT メソッドの実行中に内部エラーが発生する問題を修正しました。 minimize() メソッドの実行中に内部エラーが発生する問題を修正しました。 これはコール時にチェックされ、必要なバウンズがコールにない場合、 ValueErrorminimize() を素早く発生させる。 8580を修正

  • のメソッドから出力される callable の問題を修正しました。 get_energy_evaluation() メソッドから出力される VQD クラスのメソッドからの出力 callable が、実行時に指定された callback を正しく呼び出すようになりました。 以前はこの場合、コールバックは正しく使用されなかった。 8575を修正

  • クラシックビットのない回路で circuit_drawer()reverse_bits=True とともに使用した場合に、 cregbundle に関する警告が発せられ混乱する可能性があった問題を修正。 修正 #8690

  • OpenQASM 3 エクスポーター (qiskit.qasm3) は、 OpenQASM のビルトイン ( resetmeasure など) を正しく処理するようになりました。 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

変更なし

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。