Skip to main content
IBM Quantum Platform

Qiskit SDK 1.3 リリースノート


1.3.3

前奏曲

Qiskit 1.3.3 は 1.3 シリーズのマイナーバグフィックスリリースです。

バグ修正

  • メソッドで reverse_bits = True パラメータを使用すると、バリアラベルの位置が不正確になるバグを修正しました。 QuantumCircuit.draw() メソッドで このバグにより、バリアオペレーションのラベルの位置がずれ、回路を視覚化する際に混乱を招く可能性があった。 修正 #13609

  • 超演算子表現における非条件付きエルミート行列に対して小さな正則化係数を適用。

  • 命令の比較 Delay 回路内の命令も含め、単位と継続時間の値が等しくなければならなくなった。 #13812 を修正。

  • のバグを修正しました。 CommutationChecker 整流キャッシュにないゲートで2量子ビットのパウリ回転の整流関係をチェックすると失敗することがあるバグを修正。 例:

    import numpy as np
    from qiskit.circuit.library import RXXGate, RGate
    from qiskit.circuit.commutation_library import SessionCommutationChecker as scc
    
    res = scc.commute(RGate(2, 2), [1], [], RXXGate(np.pi / 2), [0, 1], [])

    この動作は解消され、転流関係が正しく計算されるようになった。 #13742 を修正。

  • QuantumCircuit.qubit_stop_time()QuantumCircuit.qubit_duration() が誤った時間(継続時間)を返すバグを修正。 この問題は、ある量子ビットに命令があり、他の量子ビットがアイドル状態のときに発生した。 8729を修正。

  • のバグを修正した。 RemoveIdentityEquivalent トランスパイラ・パスのバグを修正。グローバル位相までの同一性に近いゲートが回路から削除されたが、回路のグローバル位相は更新されなかった。 特に RemoveIdentityEquivalent はパラメータ化されていない GlobalPhaseGate ゲートを削除した。 #13778 を修正。

  • のバグを修正。 random_clifford() のバグを修正した。 13606を修正。

  • この場合 SabreLayout がレイアウトとルーティングの両方を同時に行うために使われる場合(デフォルト・オプションの transpile()generate_preset_pass_manager()のように) Target または CouplingMap を使用し、入力回路がカップリングマップの1つのコンポーネントに収まる場合、配線の順列が正しく追跡されるようになりました。

    以前は、配線された回路で使用される量子ビットに間接的にでも接続されていない結合マップの量子ビットは、最終的な配線の順列には含まれていなかった。 への呼び出しなど、コンパイルが成功したように見えても、障害発生地点から遠く離れた場所で驚くような動作を引き起こす可能性がある。 TranspileLayout.final_index_layout() への呼び出しなどだ。 KeyError.

    このバグは、ほとんどがそうであるように、完全に接続されているバックエンドには影響しなかった。 #13732 を修正。


1.3.2

前奏曲

Qiskit 1.3.2 は 1.3 シリーズのマイナーバグフィックスリリースです。

合成アップグレードに関する注意事項

  • の高位合成プラグインは LinearFunction の高位合成プラグインは、 メソッドに LinearFunction 以外のオブジェクトが run メソッドに渡されたときにエラーが発生しなくなりました。 その代わりに、他のプラグインと同じ None を返すようになった。 このエラーの発生を信頼した場合は、手動でインスタンス・チェックを行うことができる。

バグ修正

  • これまでは CommutationChecker の整流関係を熱心にキャッシュしていた。 Instructionparams の整流関係をキャッシュしていた。 このため、命令の定義が属性以外の追加情報に依存している場合、不正確な結果につながる可能性がある。 params 属性だけでなく、例えば PauliEvolutionGate. この動作は修正され、整流チェッカーはQiskitネイティブの標準ゲートに対してのみ整流を熱心にキャッシュするようになりました。 カスタム・ゲートの場合、この変更はパフォーマンス・コストがかかるかもしれないが、安全でないキャッシュを避けることによって正しい結果を保証する。

  • のバグを修正しました。 CommutationCheckerのバグを修正しました。 params 属性に数値以外の値(たとえば PauliGateのような)属性に数値以外の値を持つ命令の整流関係をチェックするとエラーが発生するバグを修正しました。 #13570を修正。

  • CommutationChecker のコミュテーションを正しく処理しなかった。 CRXGate, CRYGateCRZGate(4k+2)π(4k + 2)\pi kZk \in \mathbb Z これらの場合、これらのゲートはどのようなゲートともコミュートすると誤って仮定されていた。 この動作は修正され、回転角度が 4π4\pi の倍数である場合に限り、これらのゲートはどのゲートとも正しくコミュケートされるようになった。

  • 以下の回路ライブラリ関数を num_qubits=1 で呼び出すとエラーが発生するバグを修正: efficient_su2(), real_amplitudes(), excitation_preserving()pauli_two_design() (1量子ビットの場合、これらの回路には2量子ビットのゲートは含まれません)。 #13480を修正。

  • の高位合成ルーチンに "mcmt" という名前の命令が誤って渡されるバグを修正した。 MCMTGateの高位合成ルーチンに不正に渡され、失敗または無効な結果になるバグを修正した。 この問題は、たとえば MCMT この問題は、例えば、 "mcmt" という名前の回路を処理し、それを暗黙のうちに命令に変換する場合(例えば、それを別の回路に追加する場合)に発生する可能性があります。 修正 #13563

  • のデフォルトの積式合成が、演算子のすべての同一項を正しく扱えないというバグを修正した。 PauliEvolutionGate のデフォルトの積式合成が、演算子内のすべての同一項を正しく扱えなかったバグを修正した。 全同一項は、 -evolution_time に等しいグローバルな位相を導入するはずであるが、ファクター2だけずれており、パラメータ化された時間では壊れる可能性がある。 修正 #13625。 修正 #13675。 修正 #13644

  • を使用したパウリ進化合成で生成される回路の不整合を修正した。 SuzukiTrotter または LieTrotter (デフォルト)メソッドで生成された回路の不整合を修正。 パラメータ化された進化時間の場合、結果として得られる回路には、スプリアスなゼロ複素数部分を持つパラメータが含まれ、それが次の出力に影響した。 ParameterExpression.sympify(). 出力には正しく実数値のみが含まれるようになった。 修正 #13642

  • を使用すると、元のオブジェクトの長さが1であった場合に、誤った形状の位相属性が生成されるバグを修正。 PauliList.insert()qubit=True で、元のオブジェクトの長さが 1 の場合に、誤った形状の位相属性を生成する原因となっていたバグを修正しました。 修正 #13623

  • のバグを修正。 qasm3.Exporter のバグを修正しました。このバグにより、ユニタリー・ゲートを処理する際、 params フィールドの処理が正しく行われず、エクスポータがクラッシュしていました。 修正 #13362

  • メソッドのバグを修正。 Target.instruction_supported() メソッドで、 self.num_qubits==None を持つターゲットが、サポートされている基底セットとは関係なく、常に False を返してしまうバグを修正。

  • トランスパイラー・パスの UnitarySynthesis トランスパイラ・パスのバグを修正しました。 UnitaryGateが正しく合成されないというトランスパイラ・パスのバグを修正しました。 そのため、例えば、最後に処理されたブロックで回路が上書きされたり、そのようなブロックの後で測定に遭遇すると内部がパニックに陥ったりした。 #13586を修正。

  • のバグを修正した。 UnitarySynthesis トランスパイラー・パスのバグを修正。 non-2-qubit ゲートが利用可能な2量子ビット基底に含まれてしまい、次元の不一致のために TwoQubitWeylDecomposition がパニックに陥る。

  • を初期化する際のバグを修正した。 SparsePauliOpY 100\geq 100 coeffs を初期化すると、係数が1に近くなるが浮動小数点エラーが発生するバグを修正した。 係数はデフォルトで正しく1になっている。 修正 #13522


1.3.1

前奏曲

Qiskit 1.3.1 は 1.3 シリーズのマイナーバグフィックスリリースです。

回路アップグレードに関する注意事項

  • ゲートのジェネリック制御方法は、ゲートがすでにサポートされている場合に、ゲートをサポートされているベースに変換しようとすることを避けるようになった。 これにより、制御されたゲートの合成が若干変わるかもしれないが、2量子ビットのゲート数が増えることはないはずだ。

バグ修正

  • 、ブロック内に定義がない命令に対して QuantumCircuit.decompose()c_if を呼び出すとエラーが発生するバグを修正した。 #13493を修正。

  • 制御フロー操作内部の操作(例えば QuantumCircuit.for_loop()) を呼び出すと、正しく分解されなかった。 QuantumCircuit.decompose(). #13544を修正。

  • のデフォルト定義を追加した。 FullAdderGate, HalfAdderGate, ModularAdderGate および MultiplierGate ゲートのデフォルト定義を追加した。 Operatorをこれらのゲートを含む量子回路から構築できるようにした。

  • が必要とするクリーンなアンシラ量子ビットの数を修正した。 FullAdderSynthesisV95, HalfAdderSynthesisV95および ModularAdderSynthesisV95 プラグインに必要なクリーンなアンシラ量子ビットの数を修正。

  • 不足していた FullAdderSynthesisDefault に最適な分解を選択するプラグインを追加した。 FullAdderGate の最適な分解を選択するプラグインを追加。

  • 固定 HalfAdderSynthesisDefault および ModularAdderSynthesisDefault プラグイン HalfAdderGateModularAdderGate に対して、利用可能なクリーンなアンシラ量子ビットの数に基づいて最適な分解を選択する。

  • パラメータ割り当て時の不正なキャッシュ動作を修正。 EquivalenceLibrary 内の定義が壊れてしまうことがありました。 これにより、基底翻訳を並行して実行する際の予期せぬ問題が解決される。 修正 #13504

  • パラメータ化されたグローバル位相を持つ回路を処理する際に、パラメータ割り当て時にグローバル位相が正しく割り当てられない一連のバグを修正。 これまでに報告されているケースは以下の通り:

    • を呼び出した後にパラメータを割り当てる。 QuantumCircuit.decompose() を呼び出した後、パラメータを割り当てる
    • DAGから構築された回路に、パラメータを割り当てる。 dag_to_circuit()
    • で作成された回路にパラメータを割り当てる。 pauli_twirl_2q_gates()で作成された回路にパラメータを割り当てる

    修正 #13534

  • のバグを修正。 RZGate.control() のバグを修正した。 #13473 を修正。


1.3.0

前奏曲

Qiskitバージョン 1.3.0、トランスパイラのパフォーマンスと品質が大幅に改善されました。 この新バージョンのQiskitには多くの新機能、修正、改善が導入されています:

  • Qiskitのトランスピレーションの中核となるデータ構造は、内部的にRustに移植されている。 これには次のようなコンポーネントが含まれる。 DAGCircuit, Target, EquivalenceLibraryなどが含まれる。 これらすべてのデータ構造のパブリックAPIは変更されていないが、書き換え後のパフォーマンスは向上している。

  • プリセットパスマネージャで使用されるトランスパイラパスの大半がRustに移植され、その結果、 ベンチプレスのベンチマークを実行した場合、Qiskit 1.2.4 と比較して平均 6x の全体的なランタイムの改善が得られました。 書き換えの恩恵を大きく受けた、特にインパクトのあるパスは以下の通りだ。 BasisTranslator, CommutationAnalysis, ConsolidateBlocksUnitarySynthesis. 移植されたパスの完全なリストについては、機能リリースノートを参照してください。

  • コンパイル品質と回路構築速度を向上させる回路ライブラリの改良。 オペレーションは現在、次のように区別されている:

    • 構造的な操作は、一意な分解を持ち、関数として表現される。 QuantumCircuit (を返す関数として表現される(たとえば real_amplitudes()).これらの関数のほとんどはRustで構築されているため、回路構築の実行時間が大幅に短縮される。
    • さまざまな分解を使用して実装できる抽象的な操作は、次のように表されます。 Gate または Instruction (で表される(たとえば PauliEvolutionGate).これにより、抽象的な量子回路を構築し、コンパイラに最適な分解を選択させることができる。

    抽象回路記述の使用は、以下の改良と組み合わせることで特に強力になります。 HighLevelSynthesis トランスパイラ・パスは、アイドル補助量子ビットを考慮して、与えられたゲートに対して利用可能な最良の分解を見つけることができるようになりました。

  • Python 3.8 が2024-10年にサポート終了となったため、最低限サポートされる Python のバージョンは 3.9 となった。 Python 3.13 の公式サポートもこのリリースで追加された。

回路の特徴

  • の機能が改善された。 CommutationChecker の機能を改善し、以下のパラメータ付きゲートのサポートを追加した: RXXGate, RYYGate, RZZGate, RZXGate, RXGate, RYGate, RZGate, PhaseGate, U1Gate, CRXGate, CRYGate, CRZGate, CPhaseGate.以前は、これらは束縛されたパラメーターでのみサポートされていた。

  • 新しい関数 quantum_volume() 量子体積 QuantumCircuit オブジェクトを生成する関数を追加した。 クロスほか ランダム化モデル回路を用いた量子コンピュータの検証, Phys. Rev. A 100, 032328 (2019). この新しい関数は、既存の QuantumVolume オブジェクトを返すという点で、既存の QuantumCircuit オブジェクトを返すという点です。 もうひとつは、この新しい関数がマルチスレッド化され、Rubstで実装されているため、出力回路 ~10x。 QuantumVolume クラスよりも高速に出力回路を生成します。

  • 引数 QuantumVolumeclassical_permutation Trueクラスを構築する際の実行時のパフォーマンスを改善した。 内部的には quantum_volume() 関数を呼び出すようになった。この関数はRustで書かれており、量子ボリューム回路を生成する際に ~10x。

  • 新しい回路操作関数 pauli_twirl_2q_gates() を追加した。この関数を使うと、与えられた回路にパウリ・ツワーリングを適用することができる。 これは、固定された2量子ビットゲートのセットを回転させる場合にのみ機能する。 CXGate, ECRGate, CZGate, iSwapGate.例えば

    from qiskit.circuit import QuantumCircuit, pauli_twirl_2q_gates
    
    qc = QuantumCircuit(2)
    qc.cx(0, 1)
    twirled_circuit = pauli_twirl_2q_gates(qc, seed=123456)
    twirled_circuit.draw("mpl")
    _images/release_notes-1.png
  • 2つの nn -qubitレジスタのインプレース加算のためのバイナリ演算ゲートが追加された( abaa+b|a\rangle |b\rangle \mapsto |a\rangle |a+b\rangle )。このゲートは ModularAdderGate2n2^n はモジュロ加算を実装している。 HalfAdderGate はキャリーアウト量子ビットを含み FullAdderGate はキャリー・インとキャリー・アウトの両方の量子ビットを含む。 詳細と例については、それぞれのドキュメントを参照してください。

    などの既存のライブラリ回路とは対照的に、抽象ゲートを扱うことで、コンパイラ(またはユーザ)は回路のコンテキストに応じて最適なゲート合成を選択することができます。 CDKMRippleCarryAdder抽象ゲートを扱うことで、コンパイラ(またはユーザ)は回路のコンテキストに応じて最適なゲート合成を選択できる。

  • を追加した。 MultiplierGate 2つの nn -qubitレジスタの乗算、つまり ab0abab|a\rangle |b\rangle |0\rangle \mapsto |a\rangle |b\rangle |a \cdot b\rangle。詳細と例はクラス・ドキュメントを参照。

  • のブール論理量子回路は、次のように等価表現される。 qiskit.circuit.library に相当する Gate オブジェクトとして表現できるようになった。 HighLevelSynthesis トランスパイラ・パスとプラグイン・インフラストラクチャで使用できるようになりました。

  • の特別な実装が追加された。 __eq__() の特別な実装がすべての標準ライブラリ回路ゲートに追加された。 標準的なゲートのほとんどはすでにこの方式に特化していたが、そうでないものもいくつかあり、予期せぬ場所で大幅なスローダウンを引き起こす可能性があった。

  • 追加 evolved_operator_ansatz(), hamiltonian_variational_ansatz()そして qaoa_ansatz() を回路ライブラリに追加し、作用素展開に基づく変分回路を実装した。 evolved_operator_ansatz()qaoa_ansatz() は関数的に等価である。 EvolvedOperatorAnsatzQAOAAnsatzと同等だが、一般的にはより高性能である。

    ハミルトニアン hamiltonian_variational_ansatz() は、単一のハミルトニアンを受け取り、それを自動的に通約項に分割してハミルトニアン変分アサッツを実装するように設計されています。 これはすでに EvolvedOperatorAnsatzを使って手動で行うこともできたが、より便利になった。

  • 追加 grover_operator() を追加し、Groverのアルゴリズムや振幅推定/増幅などで使われるGrover演算子回路を構成できるようにした。 この関数は GroverOperatorに似ているが、マルチ制御Xゲートの実装を選択する必要はなく、コンパイラに最適な分解を決定させる。 さらに、回路を不透明なゲートに包み込むこともなく、移調に必要な分解回数が減るため、より高速になる。

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import grover_operator
    
    oracle = QuantumCircuit(2)
    oracle.z(0)  # good state = first qubit is |1>
    grover_op = grover_operator(oracle, insert_barriers=True)
    grover_op.draw('mpl')
    _images/release_notes-2.png
  • 新しいデータ属性、 qiskit.circuit.CONTROL_FLOW_OP_NAMESは、与えられた Instruction がコントロール・フロー操作であるかどうかを、名前から簡単に見つけてチェックすることができる。

  • 標準等価ライブラリ(SessionEquivalenceLibrary)は、Qiskitの標準ライブラリ 2q 連続イジング型相互作用(例えば CPhaseGate, RZZGate, RZXGateなど) を局所等価関係を使って直接変換できるルールが追加されました。 以前は、これらの変換のいくつかが2-CX形式を経由していたため、回路生成の効率が悪かった。

    一般的に BasisTranslator に対して "最良 "の等価関係を見つけることは保証されない。 Targetに対して "最良の "等価関係を見つけることは保証されないが、等価関係が存在すれば必ず見つける。 出力を向上させるために、より高価なトランスパイラの再合成とゲート最適化パスに頼っている。 これらのパスは、離散的な超制御2量子ビット相互作用の場合ほどには、連続的にパラメトライズされた2量子ビット相互作用を持つ基底セットには有効ではありません。

  • に新しい引数 "apply_synthesis" を追加した。 Decomposeこれにより、トランスパイラ・パスは、合成ルーチンによってのみ定義されるオブジェクトを分解するために高位合成を適用することができる。 例:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Clifford
    from qiskit.transpiler.passes import Decompose
    
    cliff = Clifford(HGate())
    circuit = QuantumCircuit(1)
    circuit.append(cliff, [0])
    
    # Clifford has no .definition, it is only defined by synthesis
    nothing_happened = Decompose()(circuit)
    
    # this internally runs the HighLevelSynthesis pass to decompose the Clifford
    decomposed = Decompose(apply_synthesis=True)(circuit)
  • を追加した。 iqp() 瞬間量子多項式時間(IQP)回路を構築する機能を追加した。 既存の IQP クラスに加えて、ランダムなIQP回路の構築も可能である:

    from qiskit.circuit.library import random_iqp
    
    random_iqp = random_iqp(num_qubits=4)
    random_iqp.draw('mpl')
    _images/release_notes-3.png
  • を追加した。 MCMTGate を追加し、マルチ・コントロール・マルチ・ターゲットの操作をゲートとして表現できるようにした。 この既存の回路のゲート表現 MCMT このゲート表現により、コンパイラは回路に存在する補助量子ビットの数と状態に応じて、利用可能な最良の実装を選択することができます。

    希望する実装は、高位合成プラグインを指定することで選択できる:

    from qiskit import QuantumCircuit, transpile
    from qiskit.circuit.library import MCMTGate, HGate
    from qiskit.transpiler.passes import HLSConfig  # used for the synthesis config
    
    mcmt = MCMTGate(HGate(), num_ctrl_qubits=5, num_target_qubits=3)
    
    circuit = QuantumCircuit(20)
    circuit.append(mcmt, range(mcmt.num_qubits))
    
    config = HLSConfig(mcmt=["vchain"])  # alternatively use the "noaux" method
    synthesized = transpile(circuit, hls_config=config)

    さらに MCMTGate は、制御量子ビットのカスタム(つまりオープン)制御状態もサポートしている。

  • 回路ライブラリーの近代化の一環として、以下の量子回路もオブジェクトとして表現されるか、合成法を用いて構築することができる。 Gate オブジェクトとして表現されるか、合成法を使用して構築することができます:

  • この CommutationChecker クラスはRustで書き直された。 このクラスは以前と同じ機能とパブリックAPIを保持しているが、ほとんどの場合において大幅に高速化されている。

  • PauliFeatureMap そして ZZFeatureMap では、キーが量子ビットの数を表し、値がどの量子ビットが互いにエンタングルされているかを定義する整数タプルのリストである辞書として、エンタングルメントの指定をサポートしています。 これにより、特定の量子アルゴリズムに合わせた特徴マップをより柔軟に構築できる。 使用例:

    from qiskit.circuit.library import PauliFeatureMap
    entanglement = {
      1: [(0,), (2,)],
      2: [(0, 1), (1, 2)],
      3: [(0, 1, 2)],
    }
    qc = PauliFeatureMap(3, reps=2, paulis=['Z', 'ZZ', 'ZZZ'], entanglement=entanglement, insert_barriers=True)
    qc.decompose().draw('mpl')
  • その count_ops() メソッドは QuantumCircuit のメソッドはRustで書き直されている。 今では3倍から9倍速く走る。

  • 回路ライブラリ関数の追加 pauli_feature_map(), z_feature_map(), zz_feature_map() を追加した。 これらの関数は、現在の回路ライブラリ・オブジェクトよりも約 8x 速い、 PauliFeatureMap, ZFeatureMapおよび ZZFeatureMapよりも高速であり、将来的にはこれらに取って代わる予定である。

    これらの機能は、ドロップイン交換として使用することができる:

    from qiskit.circuit.library import pauli_feature_map, PauliFeatureMap
    
    fm = pauli_feature_map(20, paulis=["z", "xx", "yyy"])
    also_fm = PauliFeatureMap(20, paulis=["z", "xx", "yyy"]).decompose()

プリミティブ機能

  • にレベル1データのサポートが追加された。 BackendSamplerV2run() また、ラップされた BackendV2. 実行オプションは、 options 辞書内の "run_options" エントリを使用して指定することができます。 BackendSamplerV2. "run_options" のエントリーは、バックエンドの run() メソッドに渡す引数名と値を対応付ける辞書でなければならない。 実行オプションで "meas_level = 1 " を設定すると、バックエンドからの結果はビット配列(レベル2フォーマット)ではなく、レベル1の結果として扱われる。

  • Estimator そして StatevectorEstimator 入力回路がいくつかのサブシステムのリセットを含む場合、確率的な方法で期待値を返す。 以前は再現できなかった結果が、ランダムなシードを設定すれば再現できるようになった。 例:

    from qiskit.primitives import StatevectorEstimator
    
    estimator = StatevectorEstimator(seed=123)

    または:

    from qiskit.primitives import Estimator
    
    estimator = Estimator(options={"seed":123})

OpenQASM 特徴

  • クラス qasm3.CustomGate はプログラムで検査できるようになった。 その constructor, name, num_params そして num_qubits は、オブジェクトが構築された後、 Python から見ることができるようになった。 これにより、次のような提供されたデータ属性の内容を検査することができる。 STDGATES_INC_GATES.

QPYの特長

  • オブジェクトのQiskitネイティブ表現を追加する新しいQPYフォーマットバージョン13を追加。 ParameterExpression オブジェクトを追加しました。

量子情報の特徴

  • の性能は SparsePauliOp.from_operator() の性能は、 Qiskit 1.0 で紹介されたアルゴリズム改善手法の上に最適化されています。 完全に密な行列の場合、以前より約5倍高速になり、すべてのパウリ項を含む 10q 演算子を分解するのに約 40ms かかる。

  • に新しい引数 assume_unitary を追加。 qiskit.quantum_info.Operator.power(). True の場合、 Operator を小数乗にするために、シューアの分解に基づくより高速な方法を用いる。

  • 追加 SparsePauliOp.to_sparse_list() を追加しました。 これは SparsePauliOp.from_sparse_list(). 例:

    from qiskit.quantum_info import SparsePauliOp
    
    op = SparsePauliOp(["XIII", "IZZI"], coeffs=[1, 2])
    sparse = op.to_sparse_list()  # [("X", [3], 1), ("ZZ", [1, 2], 2)]
    
    other = SparsePauliOp.from_sparse_list(sparse, op.num_qubits)
    print(other == op)  # True
  • の性能は Pauli.to_label() は大きなパウリに対して著しく改善された。

  • メソッド Operator.power() は新しいパラメータ branch_cut_rotation を持つ。 これはルートの分岐点を移動させるために使用でき、どの行列が主ルートとして選ばれるかに影響する。 デフォルトでは、(パウリ作用素のような)実負の固有値を持つ作用素の根が数値精度の違いに対してより安定するように、小さな正の回転に設定されています。

  • 新しいobservableクラスが追加されました。 SparseObservable と同様、観測値を項の総和で表す。 SparsePauliOpと似ているが、2つの相違点がある:

    1. それぞれの完全な項は、(事実上)一連の (qubit, bit_term) ペアとして保存され、その項のアイデンティティを受ける量子ビットは保存されない。 これにより、ポーリスの加重和 iciZi\sum_i c_i Z_i のような観測値のメモリ使用量が大幅に改善される。
    2. 1量子ビットの項アルファベットは演算子空間に対して完全すぎる。 SparsePauliOpのような)パウリ演算子だけでなく、 00\lvert 0\rangle\langle 0\rangle のようなパウリ演算子の固有状態への射影子も表すことができる。このような投影子は、対応するパウリ作用素と同様にハードウェア上で効率的に測定することができるが、次のような場合は指数関数的な数が必要になる。 SparsePauliOp00n{\lvert0\rangle\langle0\rvert}^{\otimes n} を表現するためには指数関数的な数の項が必要になりますが、 nn クビット上では SparseObservable は一つの項しか必要としません。

    を構築し、操作することができる。 SparseObservable のユーザーにはおなじみのインターフェイスを使って SparsePauliOp:

    from qiskit.quantum_info import SparseObservable
    
    obs = SparseObservable.from_sparse_list([
      ("XZY", (2, 1, 0), 1.5j),
      ("+-", (100, 99), 0.5j),
      ("01", (50, 49), 0.5),
    ])

    SparseObservable プリミティブ(qiskit.primitives)への入力形式としてはサポートされていないが、将来的にはこれらのインターフェイスを拡張して、これらの形式を含むようにする予定である。

合成機能

  • 合成機能の追加 synth_mcx_gray_code() および synth_mcx_noaux_v24() を追加した。 これらの機能は、追加のアンシラ量子ビットを必要としない。

  • 合成機能の追加 synth_c3x()synth_c4x() を追加し、それぞれ3制御と4制御のXゲートを合成するようにした。

  • 合成機能の追加 synth_mcx_n_dirty_i15()k2k - 2 ダーティな補助量子ビットを用いて kk 制御のマルチ制御Xゲートを合成し、最大で 8k68 * k - 6 CXゲートを持つ回路を生成する。 アル。 (arXiv:1501.06911).

  • 合成機能の追加 synth_mcx_n_clean_m15() マスロフ( arXiv:1508.03273 )による、 k2k - 2 クリーンな補助量子ビットを使って、 6k66 * k - 6 CXゲートを持つ回路を生成する、 kk 制御を持つマルチ制御Xゲートを合成する関数を追加。

  • 合成機能の追加 synth_mcx_1_clean_b95() Barencoら( arXiv:quant-ph/9503016 )による、 16k816 * k - 8 CXゲートを持つ回路を生成する単一のクリーンな補助量子ビットを使用して、 kk 制御を持つマルチ制御Xゲートを合成する機能を追加。

  • 追加 adder_qft_d00(), adder_ripple_c04()adder_ripple_v95() で加算ゲートを合成する、 ModularAdderGate, HalfAdderGateを追加した。 FullAdderGate.

  • 追加 multiplier_cumulative_h18()multiplier_qft_r17() を合成する MultiplierGate.

  • 追加 synth_mcmt_vchain() 高位合成プラグインとともに、線形数のトフォリゲートと k-1 k制御量子ビット用の補助量子ビットを持つマルチ制御マルチターゲットゲートを合成するために MCMTSynthesisVChain.

  • のハイレベル合成プラグイン構造を追加した。 MCMTGateを含む MCMTSynthesisNoAux (補助量子ビットなし)、前述の MCMTSynthesisVChain ( num_control - 1 補助量子ビットを使用)、および MCMTSynthesisDefault を追加し、コンパイラが最適な分解を選択できるようにしました。

  • この関数 random_clifford() はRustに移植され、実行時間が3倍改善された。

  • 追加 ProductFormula.expand()積式の展開をスパース・パウリ形式で見ることができます。 例えば、ハミルトニアンの2次トロッター展開のフォーマットを次のように問い合わせることができる:

    from qiskit.quantum_info import SparsePauliOp
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.synthesis.evolution import SuzukiTrotter
    
    hamiltonian = SparsePauliOp(["IX", "XI", "ZZ"], coeffs=[-1, -1, 1])
    evo = PauliEvolutionGate(hamiltonian, time=3.14)
    trotter = SuzukiTrotter(order=2)
    print(trotter.expand(evo))

    を印刷する

    [('X', [0], -3.14), ('X', [1], -3.14), ('ZZ', [0, 1], 6.28),
    ('X', [1], -3.14), ('X', [0], -3.14)]
  • のプラグイン構造を追加。 PauliEvolutionGate. デフォルトのプラグイン PauliEvolutionSynthesisDefaultは以前と同じように回路を構築するが、内部的にRustを使用しているため、より高速である。 回路が大きいほど(例えば。 ハミルトニアンサイズ、タイムステップ数、スズキ・トロッター次数によって)、高速化が大きくなる。 例えば、10回のタイムステップと4次のトロッター式を持つ100量子ビットのハイゼンベルグ・ハミルトニアンは、現在では ~9.4x。 新しいプラグインは、 PauliEvolutionSynthesisRustiqは、 (de) BrugièreとMartielによる論文「ハミルトンシミュレーション回路のより高速でより短い合成」 に記載され、 Rustiq に実装されている合成アルゴリズムを使用します。 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.quantum_info import SparsePauliOp
    from qiskit.circuit.library import PauliEvolutionGate
    from qiskit.compiler import transpile
    from qiskit.transpiler.passes import HLSConfig
    
    op = SparsePauliOp(["XXX", "YYY", "IZZ"])
    qc = QuantumCircuit(4)
    qc.append(PauliEvolutionGate(op), [0, 1, 3])
    config = HLSConfig(PauliEvolution=[("rustiq", {"upto_phase": False})])
    tqc = transpile(qc, basis_gates=["cx", "u"], hls_config=config)
    tqc.draw(output='mpl')
    _images/release_notes-4.png

    このコード・スニペットでは、 Rustiq プラグインを使って量子回路qcのオブジェクトを合成している。 PauliEvolutionGate オブジェクトを合成する。 このプラグインは、追加オプション upto_phase = False で呼び出され、グローバル位相が保持されない可能性がある代償として、より小さな回路を得ることができます。 サポートされるオプションの全リストは PauliEvolutionSynthesisRustiq.

  • synth_cz_depth_line_mr() からラストへ。 この関数は、MaslovとRoettelerの方法に基づいて、線形最近傍(LNN)接続用のCZ回路を合成する。 350x350 のバイナリ行列では,Rust の実装により,約 30x の高速化が得られる.

  • ポート synth_permutation_reverse_lnn_kms() をRustに移植し、Kutin, Moulton, Smithline法を用いてLNNアーキテクチャの逆順列を合成する。

  • に新しい引数 preserve_order を追加しました。 ProductFormulaこれは、最終的な回路の深さを圧縮するために、積の式展開の前にハミルトニアンのPauli項を並べ替えることができます。 これを False に設定すると、次のような形の項ができる

Z0Z1+X1X2+Y2Y3Z_0 Z_1 + X_1 X_2 + Y_2 Y_3

に並び替えられる

Z0Z1+Y2Y3+X1X2Z_0 Z_1 + Y_2 Y_3 + X_1 X_2

これは、 RZZRYY の回転が並行して行われることを意味する。

このオプションはプラグインのインターフェイスで設定できる:

from qiskit import QuantumCircuit, transpile
from qiskit.circuit.library import PauliEvolutionGate
from qiskit.quantum_info import SparsePauliOp
from qiskit.synthesis.evolution import SuzukiTrotter
from qiskit.transpiler.passes import HLSConfig

op = SparsePauliOp(["XXII", "IYYI", "IIZZ"])
time, reps = 0.1, 1

synthesis = SuzukiTrotter(order=2, reps=reps)
hls_config = HLSConfig(PauliEvolution=[("default", {"preserve_order": False})])

circuit = QuantumCircuit(op.num_qubits)
circuit.append(PauliEvolutionGate(op, time), circuit.qubits)

tqc = transpile(circuit, basis_gates=["u", "cx"], hls_config=hls_config)
tqc.draw('mpl')
_images/release_notes-5.png

トランスパイラ機能

  • 引数 matrix_basedCollectCliffords を追加する。 新しいパラメータ matrix_based=True の場合 CollectCliffords トランスパイラ・パスは、特定のパラメータに対してクリフォード・ゲートであるユニタリー・ゲートを集めることができる。 RZGateπ/2\pi / 2 ゲートを収集することができます。

  • 最適化レベル RemoveIdentityEquivalent トランスパイラー・パスは、最適化レベル2と3のプリセット・パス・マネージャーの一部として実行されるようになった。 このパスは、 initoptimization の両ステージで実行される。なぜなら、このパスが適用する最適化は両ステージで有効であり、パスの実行は高速だからである。

  • を合成するための複数のハイレベル合成プラグインを追加した。 MCXGate:

    また、次も検索されます:

    • MCXSynthesisDefaultクリーンなアンシラ量子ビットとダーティなアンシラ量子ビットの数に基づいて、最も効率的な合成方法を選択する。

    一例として、次の回路の移調を考えてみよう:

    from qiskit.circuit import QuantumCircuit
    from qiskit.compiler import transpile
    
    qc = QuantumCircuit(7)
    qc.x(0)
    qc.mcx([0, 1, 2, 3], [4])
    qc.mcx([0, 1, 2, 3, 4], [5])
    qc.mcx([0, 1, 2, 3, 4, 5], [6])
    
    transpile(qc).draw('mpl', fold=-1)
    _images/release_notes-6.png

    最初のMCXゲートでは、量子ビット 56 をクリーンなアンシラとして使用することができ、利用可能な最良の合成方法 synth_mcx_n_clean_m15 が選択される。 2つ目のMCXゲートでは、 6synth_mcx_n_clean_m15 の方法は適用されないので、 synth_mcx_1_clean_b95 の方法が選択される。 3番目のMCXゲートでは、アンシラ量子ビットは存在せず、 synth_mcx_noaux_v24

  • トランスパイラーの SabreLayout トランスパイラ・パスが更新され、 layout_trials キーワード引数の値とは無関係に、デフォルトでさらに 2 回または 3 回のレイアウト試行が実行されるようになりました。 些細なレイアウトとその逆がすべてのバックエンドに含まれている。 DenseLayout1.2.0 で追加されたトライアルと同じように、すべてのバックエンドに含まれている。 これに加えて、バックエンドが127、133、156量子ビットの場合、 IBM バックエンドヘビーヘックス接続グラフ上の最大のリングが追加される。 これは、これらの一般的に実行されるバックエンドのいくつかのサーキットにとっては良い出発点となり得るが、他のすべてのサーキットにとっては、追加の "ランダムトライアル "に過ぎない。

  • DAGCircuit がRustで再実装された。 この Python クラスの書き換えは、以前の Python 実装と完全にAPI互換性があるはずだ。 このクラスは以前は rustworkxを使って実装されており、その基礎となるデータグラフ構造はRustに存在していたが、クラスの実装とすべてのデータは Python。 この新バージョンの DAGCircuit この新しいバージョンは、すべてのデータに対してラスト・ネイティブ表現を保存し、静止時の命令用に設計された圧縮されたqubitとclbit表現により、よりメモリ効率が高くなっている。 を完全に操作するトランスパイラ・パスが可能になる。 DAGCircuit を完全に操作できるようになり、パフォーマンスが向上する。

  • に新しい引数 qubits_initially_zero が追加された。 qiskit.compiler.transpile(), generate_preset_pass_manager()PassManagerConfig. デフォルト値の True に設定すると、量子ビットは最初に 0|0\rangle の状態にあると仮定されるため、個々のトランスパイラ・パスの最適化の機会が増える可能性があります。 特に HighLevelSynthesis トランスパイラ・パスは、特に、状態 のアイドル補助量子ビットが利用可能な場合、各ゲートに対してより良い分解を選択します。 MCXGate 特にトランスパイラ・パスは、 0|0\rangle のアイドル補助量子ビットが利用可能な場合、回路の各ゲートに対してより良い分解を選択します。

    しかし、量子ビットを適切に初期化しないバックエンドのためにトランスパイルする場合や、より大きな量子回路のサブサーキットのトランスパイラパスを手動で呼び出す場合など、 qubits_initially_zeroFalse に設定すべき場合があります。

  • トランスパイラ・パスのコンストラクタは、追加引数を受け付けるようになった。 HighLevelSynthesis トランスパイラ・パスのコンストラクタは、追加の引数を受け付けるようになりました: qubits_initially_zeroTrue に設定すると、パスは量子ビットが初期状態 0|0\rangle にあると仮定します。さらに、パスは実行中、クリーンな補助量子ビットとダーティな補助量子ビットを追跡し、kwargs num_clean_ancillasnum_dirty_ancillas を使ってこの情報をプラグインに渡します。

  • トランスパイラ・パスのアンシラ量子ビットの取り扱いを改善。 HighLevelSynthesis トランスパイラ・パスの 例えば、回路はカスタム・ゲートを持ち、その定義には MCXGates. これで、内部 MCXGateの合成アルゴリズムは、カスタムゲートの定義の外側で、グローバル回路で利用可能なアンシラ量子ビットを使用することができます。

  • 新しいメソッド DAGCircuit.control_flow_op_nodes() メソッドを追加した。 DAGOpNode を含む DAGCircuit を含む ControlFlowOp. これは DAGCircuit.op_nodes() メソッドを使い ControlFlowOp クラスをフィルターとして渡すことで可能だったが、この新しい関数の方がより高速に処理を実行できる。

  • によって返され、内部で使用されます。 generate_preset_pass_manager() によって返され transpile() で使用されるトランスパイラ・パスの大半はRustに移植された。 これにより、各パスのランタイム性能が大幅に改善され、トランスパイラの全体的な運用効率が大幅に向上した。 今回のリリースでRustに移植されたパスのリストは以下の通り:

  • 新しいトランスパイラー・パスが追加された、 RemoveIdentityEquivalent このパスは、ある許容範囲まで同一性と等価なゲートを削除するために使用される。 例えば、こんな回路があったとする:

    _images/release_notes-7.png

    をなくすことができる。 CPhaseGate:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import RemoveIdentityEquivalent
    
    qc = QuantumCircuit(2)
    qc.cp(1e-20, 0, 1)
    
    removal_pass = RemoveIdentityEquivalent()
    result = removal_pass(qc)
    result.draw("mpl")
    _images/release_notes-8.png
  • パスが ConsolidateBlocks パスは Collect2qBlocks パスに相当するパスが内部的に実行されます。 以前は Collect2qBlocks または Collect1qRuns を実行する前に ConsolidateBlocksConsolidateBlocks の前に実行されなければならなかった。 内部でコレクションを行うことで、パスによるオーバーヘッドが削減される。 もし Collect2qBlocks または Collect1qRunsConsolidateBlocksが先に実行された場合、プロパティセットからそれらのパスによって収集された実行が使用され、パスの動作に変更はない。

  • トランスパイラー・パス RemoveDiagonalGatesBeforeMeasure トランスパイラー・パスは、より多くの対角線ゲートを含むようにアップグレードされた: PhaseGate, CPhaseGate, CSGate, CSdgGate そして CCZGate. さらに RemoveDiagonalGatesBeforeMeasure のコードはRustに移植され、20量子ビット回路で x20。

可視化機能

  • 可視化関数には、新しい引数 timeline_drawer() 可視化関数には新しい引数 target が追加された。 Target オブジェクトを指定します。 デフォルトでは、この関数は Instruction.duration を使用しますが、ターゲットを指定すると、代わりにターゲット内部のタイミング詳細を活用します。

既知の問題

  • を含む回路でQPYフォーマット10、11、または12を使用する場合、ペイロードを生成した環境にインストールされた パッケージのバージョン( ParameterExpressionを含む回路でQPY書式10、11、12を使用する場合、ペイロードを生成した環境にインストールされた symengine パッケージのバージョン(qpy.dump())が、ペイロードがロードされた環境にインストールされた symengine のバージョン(qpy.load())にインストールされている のバージョンと一致しない場合、エラーが発生します。 このエラーが発生した場合は、エラーメッセージにある symengineqpy.load(). QPYフォーマットのバージョン13以降(または10以前)では、この問題は発生しません。 したがって ParameterExpression オブジェクトをシリアライズしている場合は ScheduleBlock オブジェクトをシリアライズしている場合は、この問題を避けるためにバージョン13を使用することをお勧めします。

アップグレードの注意

  • 次のクラスでは、 X\sqrt{X} の操作を使ってPauli-Y演算子を対角化する: PauliEvolutionGate, EvolvedOperatorAnsatzそして PauliFeatureMap. 以前は、これらのクラスは HSH S または RX(π/2)R_X(-\pi/2) を基底変換として使用していた。 で表される X\sqrt{X}SXGate で表される演算を使うと、シングルトンとして実装されたゲートを1つだけ使うので、より効率的である。

    以前のゲートの使い方に頼っていた場合は、Qiskit 1.2 で回路を構築し、次のようにしてエクスポートすることをお勧めします。 qpy.dump()でエクスポートするか、カスタム TransformationPassでエクスポートすることをお勧めします。

  • Python の最小サポートバージョンは 3.9 となり、以前の最小サポートバージョン 3.8 から引き上げられた。 この変更が必要になったのは、上流の cPython プロジェクトが Python 3.8 をサポートしなくなったからである。

回路アップグレードに関する注意事項

  • この QuantumVolume クラスは、以前のQiskitリリースから、与えられたシード値に対して異なるユニタリー行列と順列を持つ回路を生成します。 これは、回路生成に新しい内部乱数発生器を使用し、より高速に回路を生成するためである。 同じシードで正確な回路が必要な場合は、Qiskitの以前のリリースを使用して、 flatten=True 引数で回路を生成し、その回路を qpy.dump() で回路をエクスポートし、このリリースでロードします。

プリミティブのアップグレードに関する注意事項

  • を使用する場合 BackendSamplerV2を使うと、ラップされたインスタンスの run() メソッドに回路を渡す前に、回路のメタデータがクリアされなくなる。 BackendV2 インスタンスの この動作に依存していた場合は、メタデータを手動でクリアしてから BackendSamplerV2.run() を呼び出す前に circuit.metadata.clear()

QPY アップグレードに関する注意事項

  • この qpy.dump() 関数はデフォルトでバージョン13の書式を出力するようになった。 つまり、デフォルトでこの関数を使用して生成されたペイロードは、Qiskit 1.3.0 以降としか互換性がありません。 ペイロードを以前のバージョンのQiskitでロードする必要がある場合は、 version フラグを qpy.dump() フラグを使用してください。 詳細は QPY互換性を参照。

トランスパイラ アップグレード ノート

  • DAGNode オブジェクト(およびそのサブクラス DAGInNode, DAGOutNodeおよび DAGOpNodeメソッドから同じオブジェクトへの参照を返さなくなりました。 DAGCircuit メソッドから同じオブジェクトへの参照を返さなくなりました。 これは、すべての返されたノードが同じオブジェクトへの共有参照であることを保証するものではなかった。 しかし DAGCircuit への移行に伴い、新しい DAGNode のインスタンスは、ノードが Python に返されると、その場で生成される。 これらのオブジェクトは、 == や、 __eq__ に依存する類似のチェックを使用して等しいと評価されるが、同じオブジェクトとして識別されなくなる。

  • インスタンス DAGOpNode インスタンスは DAGCircuit から返されるインスタンスは、もはやDAGに保存されている基礎データへの共有参照ではない。 以前のリリースでは、次のようなことが可能だった:

    for node in dag.op_nodes():
        node.op = new_op

    しかし、この種の突然変異は、DAGの内部キャッシュを壊し、データ構造の破損を引き起こす可能性があるため、常に健全ではなかった。 代わりに DAGCircuit を使うべきである。 DAGCircuit.substitute_node() または DAGCircuit.substitute_node_with_dag(). 例えば、上記のコードブロックはこうなる:

    for node in dag.op_nodes():
      dag.substitute_node(node, new_op)

    これは、 1.2.0 のアップグレードノートに類似している。 DAGOpNode.op 属性ではなく DAGOpNode そのものではなく、属性の変異について言及されています。 しかし、 1.3、これは内部の op 属性だけでなく、オブジェクト全体に及ぶ。 一般的に、この種の突然変異は常に不健全であり、サポートされていなかったが、以前は場合によっては機能する可能性があった。

  • ここで transpile() は、量子ビットが初期状態 0|0\rangle にあると仮定している。この仮定を避けるには、引数 qubits_initially_zeroFalse に設定すればよい。

非推奨のメモ

  • この qiskit.pulse モジュールとその関連機能はすべて非推奨となり、Qiskit 2.0.0 で削除される予定です。 これは、パルスをサポートする主要なバックエンド・プロバイダーが IBM であり、パルス・レベルのアクセスは現在 IBM のバックエンドのサブセットでしかサポートされておらず、その新しいアーキテクチャではサポートされていないからである。 同様に、 パルス・レベル・アクセスは2025年に削除されると発表している。パルス・アクセスをサポートする機能を使用している最大のプロバイダーがいなくなれば、Qiskitにとってのこの機能の重要性は著しく低下し、削除されるパッケージの継続的なメンテナンスのオーバーヘッドと天秤にかける必要がある。

    のすべてのpulseコードが非推奨になります。 qiskit.pulse のすべてのpulseコード、およびpulseに依存または関連する機能(pulseの可視化、シリアライズ、カスタム較正サポートなど)が含まれます。 詳細については、以下の非推奨セクションを参照のこと。

    Pulseパッケージ全体は、Qiskitの直接関連コンポーネントとともに、 Qiskit Dynamics リポジトリに移され、パルスと低レベル制御のシミュレーションがさらに可能になります。 Qiskit 1.x は、使用期限が切れるまで qiskit.pulse サポートし続けます。

回路の廃止予定

  • 非推奨の Instruction.condition 属性と Instruction.c_if() メソッドを廃止しました。 これらはQiskit 2.0 で、Qiskitデータモデルでの使用とともに削除されます。 この機能は、回路の古典的な状態を記述できる IfElseOp クラスに取って代わられました。 例えば Instruction.c_if() のようなものです:

    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(2, 2)
    qc.h(0)
    qc.x(0).c_if(0, 1)
    qc.z(1.c_if(1, 0)
    qc.measure(0, 0)
    qc.measure(1, 1)

    これは、以下のように記述できます。

    qc = QuantumCircuit(2, 2)
    qc.h(0)
    with qc.if_test((qc.clbits[0], True)):
        qc.x(0)
    with qc.if_test((qc.clbits[1], False)):
        qc.z(1)
    qc.measure(0, 0)
    qc.measure(1, 1)

    現在では廃止された ConvertConditionsToIfOps トランスパイラ・パスは、既存の回路に対してこの変換を自動化するために使用できます。


  • Qiskit Pulseパッケージの廃止に伴い、以下の依存関係も廃止されます:

  • その QuantumCircuit.unitQuantumCircuit.duration 属性は非推奨となり、 Qiskit 2.0.0 で削除される予定です。 これらの属性は、回路上で実行される推定時間とその時間の単位を追跡するために使用された。 しかし、これらの属性の値は、トランスパイラが正しい設定で実行された場合にのみ適切に入力されるため、常に制限されていました。 の持続時間の合計の最も長いパスに基づいて推測したに過ぎず、回路内の制御フローや条件分岐を正しく考慮することはできない。 DAGCircuit であり、回路の制御フローや条件分岐を正しく考慮することはできない。

  • その DAGCircuit.unitDAGCircuit.duration 属性は非推奨となり、 Qiskit 2.0.0 で削除される予定です。 これらの属性は、回路上で実行される推定時間とその時間の単位を追跡するために使用された。 しかし、これらの属性の値は、トランスパイラが正しい設定で実行された場合にのみ適切に入力されるため、常に制限されていました。 の持続時間の合計の最も長いパスに基づいて推測したに過ぎず、回路内の制御フローや条件分岐を正しく考慮することはできない。 DAGCircuit であり、回路の制御フローや条件分岐を正しく考慮することはできない。

  • その Instruction.durationInstruction.unit 属性は非推奨となり、 Qiskit 2.0.0 で削除される予定です。 unit duration これには、任意の qiskit.circuit.Instruction またはサブクラスの引数を設定することも含まれます。 これらの属性は、カスタム実行期間とその期間を表す単位を個々の命令に付加するために使用された。 しかし、ゲートの持続時間の真実の源は BackendV2Target であり、バックエンドでサポートされている各命令の持続時間を含んでいます。 インストラクションの継続時間は、通常ユーザーが調整できるものではなく、バックエンドの不変のプロパティである。 以前、この機能を使ってゲートの持続時間を変えて実験していたのなら、指定されたフィールドの InstructionProperties.duration フィールドを Target での単位は常に秒です)。 Target).

プロバイダーの廃止予定

  • この BasicSimulator.configuration() メソッドは非推奨で、 2.0.0 で削除される予定です。 このメソッドは、廃止された BackendV1 モデルの一部であるレガシーな providers.models.BackendConfiguration インスタンスを返した。 このモデルは BackendV2制約がバックエンドのインスタンスまたは基礎となる Target (backend.target) に格納されます。

    以下は、 BackendConfiguration の最も一般的な属性にアクセスするためのクイックガイドです。 BackendV2 モデルにアクセスするための簡単なガイドです:

    BackendV1 model (deprecated) ------------> BackendV2 model
    ----------------------------               ---------------
    backend.configuration().backend_name       backend.name
    backend.configuration().backend_version    backend.backend_version
    backend.configuration().n_qubits           backend.num_qubits
    backend.configuration().num_qubits         backend.num_qubits
    backend.configuration().basis_gates        backend.target.operation_names (*)
    backend.configuration().coupling_map       backend.target.build_coupling_map()
    backend.configuration().local              No representation
    backend.configuration().simulator          No representation
    backend.configuration().conditional        No representation
    backend.configuration().open_pulse         No representation     
    backend.configuration().memory             No representation      
    backend.configuration().max_shots          No representation      

    (ⅳ*) Backend.target.operation_names には、 basis_gates と追加の非ゲート命令が含まれていることに注意してください。実装によっては、出力をフィルタリングする必要があるかもしれません。

    モデルへの移行の詳細については、 このガイドを参照してください。 BackendV2 モデルへの移行については、このガイドを参照してください。


  • Qiskit Pulseパッケージの非推奨化の一環として、pulseクラス qiskit.providers.BackendV2 内のすべてのパルス関連機能が非推奨となります。 これには以下の方法が含まれます:

    その結果 qiskit.providers.BackendV2Converter クラスと qiskit.providers.fake_provider.GenericBackendV2 クラスの対応するチャネル・メソッドも非推奨となります。

    pulse_channels calibrate_instructions さらに BackendV2 引数は非推奨です。

  • 引数 defaults は廃止されました。 qiskit.providers.convert_to_target() 関数から非推奨となっています。

QPYの廃止予定機能

トランスパイラーの非推奨機能

  • 非推奨 StochasticSwap に取って代わられた SabreSwap. クラスがトランスパイル関数から呼び出される場合、変更は例えば次のようになる:

    from qiskit import transpile
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.providers.fake_provider import GenericBackendV2
    
    
    qc = QuantumCircuit(4)
    qc.h(0)
    qc.cx(0, range(1, 4))
    qc.measure_all()
    
    cmap = CouplingMap.from_heavy_hex(3)
    backend = GenericBackendV2(num_qubits=cmap.size(), coupling_map=cmap)
    
    tqc = transpile(
        qc,
        routing_method="stochastic",
        layout_method="dense",
        seed_transpiler=12342,
        target=backend.target
    )

    to:-->

    tqc = transpile(
        qc,
        routing_method="sabre",
        layout_method="sabre",
        seed_transpiler=12342,
        target=backend.target
    )

    一方、パス・マネージャーはこう変わる:

    passmanager = PassManager(StochasticSwap(coupling, 20, 13))
    new_qc = passmanager.run(qc)

    to:-->

    passmanager = PassManager(SabreSwap(backend.target, "basic"))
    new_qc = passmanager.run(qc)
  • トランスパイラパス ConvertConditionsToIfOps は非推奨となり、 Qiskit 2.0.0 で削除される予定です。 このクラスは現在非推奨です。 Instruction.condition は非推奨となり、 2.0.0 で削除される予定です。

  • basis_gates 引数によるカスタムゲートの提供は、以下の両者では非推奨。 transpile()generate_preset_pass_manager(). この機能はQiskit 2.0 で削除されます。 カスタム・ゲートは Target 引数 target 。 インスタンスは Target インスタンスをゼロから構築するか Target.from_configuration()custom_name_mapping メソッドを使うこともできる。 例:

    from qiskit.circuit.library import XGate
    from qiskit.transpiler.target import Target
    
    basis_gates = ["my_x", "cx"]
    custom_name_mapping = {"my_x": XGate()}
    target = Target.from_configuration(
        basis_gates=basis_gates, num_qubits=2, custom_name_mapping=custom_name_mapping
    )

  • Qiskit Pulseパッケージの廃止の一環として、qiskit.transpiler.Target class 内のpulse関連の側面が廃止予定です。 次のものが含まれます。


    さらに、以下のトランスパイラパスも廃止予定となります:

  • inst_mapgenerate_preset_pass_manager(), from_configuration(), PassManagerConfig initializerと generate_scheduling() の引数は非推奨となっている。

  • calibration イニシャライザー・メソッドにおける InstructionProperties() 引数は非推奨です。

  • 以下 transpile()generate_preset_pass_manager() 引数は非推奨。 Target: instruction_durations timing_constraints および backend_properties。 これらの引数は、次のようにしてターゲットを構築するために使用できる。 Target.from_configuration():

    Target.from_configuration(
         ...
         backend_properties = backend_properties,
         instruction_durations = instruction_durations,
         timing_constraints = timing_constraints
    )
  • メソッドは PassManagerConfig.from_backend() メソッドは BackendV12.0 型の入力をサポートしなくなります。 BackendV1 は非推奨であり、実装は BackendV2.

各種 非推奨

バグ修正

  • でのパフォーマンスのリグレッションを修正しました。 QuantumCircuit.assign_parameters() Qiskit 1.2.0 で導入された、タイトなループでメソッドを呼び出すと、パラメトリックな回路から少数のパラメーターしか各反復でバインドされないというパフォーマンスのリグレッションを修正しました。 可能であれば、すべての代入を同時に行って assign_parameters() これは、入力の正規化とエラーチェックのオーバーヘッドに費やす時間の割合を減らすためである。

  • については BasicSimulatorの場合、 configuration() メソッドによって返されるコンフィギュレーション・インスタンスの basis_gates エントリーは、 dict_keys インスタンスではなくリストになり、期待される型と一致し、コンフィギュレーション・インスタンスをディープ・コピーできるようになった。

  • の問題を修正しました。 DAGCircuit.apply_operation_back()DAGCircuit.apply_operation_front() での問題を修正した。 Clbit オブジェクトを qargs 引数の入力に設定すると、黙って受け入れられてしまう問題を修正した。 型の不一致が正しく認識され、例外が発生するように修正された。

  • のデコレーターが欠落していたのを修正した。 C3SXGateGate.to_matrix() が呼ばれた場合に失敗していたのを修正した。 ゲートマトリックスは期待通りに戻ってきた。

  • のバグを修正した。 QuantumCircuit.assign_parameters()定義がすでにトリガーされている標準ゲートにパラメーターを割り当てる際に発生する この場合、新しい値がゲート・インスタンスに正しく伝わらなかった。 回路そのものは期待通りにコンパイルされていたが、個々のオペレーションを検査すると、古いパラメータが表示されたままだった。

    例:

    from qiskit.circuit.library import EfficientSU2
    
    circuit = EfficientSU2(2, flatten=True)
    circuit.assign_parameters([1.25] * circuit.num_parameters, inplace=True)
    print(circuit.data[0].operation.params)  # would print θ[0] instead of 1.25

    #13478を修正。

  • "circular""sca"NLocal 回路とその派生回路のエンタングルメントに関するバグを修正した。 2量子ビット以上のエンタングルメント・ブロックの場合、以前は円形のエンタングルメントにはいくつかの接続が欠けていた。 例えば、4量子ビットでブロック・サイズが3の場合、以前は次のようなコードが使われていた:

    [(2, 3, 0), (0, 1, 2), (1, 2, 3)]

    が、現在は (3, 0, 1) 、正しく接続が追加されている:

    [(2, 3, 0), (3, 0, 1), (0, 1, 2), (1, 2, 3)]

    そのため、 "circular""sca" のエンタングルには、レイヤーごとに num_qubits のエンタングルブロックが使用されている。

  • トランスパイラー・パスに CollectCliffords を追加する。 特に、ゲートを追加した。 ECRGate, DCXGate, iSwapGate, SXGateSXdgGate を追加した。

  • のバグを修正した。 QuantumCircuit.decompose() で合成できるオブジェクトが HighLevelSynthesis で合成できるオブジェクトが、最初に合成され、すぐに分解される(つまり、1回ではなく2回分解される)バグを修正した。 などのゲートに影響を与えた。 MCXGateCliffordなどのゲートに影響を及ぼした。

  • のバグを修正した。 QuantumCircuit.decompose()"gates_to_decompose" 引数で明示的に設定した場合、定義のない高レベルオブジェクトが分解されないというバグを修正した。 例えば、以前は以下のようにしても分解が行われなかったが、現在は期待通りに動作する:

    from qiskit import QuantumCircuit
    from qiskit.quantum_info import Clifford
    from qiskit.transpiler.passes import Decompose
    
    cliff = Clifford(HGate())
    circuit = QuantumCircuit(1)
    circuit.append(cliff, [0])
    
    decomposed = Decompose(gates_to_decompose=["clifford"])(circuit)
  • 以前は HighLevelSynthesis トランスパイラ・パスは、合成プラグインが利用可能な命令を、その命令がすでにターゲットでサポートされているか、明示的に渡された basis_gates の一部であるかに関係なく、合成していました。 この動作は修正され、すでにサポートされている命令は合成されなくなった。

  • トランスパイルパスは InverseCancellationControlFlowOp 操作に再帰します。 QuantumCircuit. 以前は、制御フロー・ブロック内の逆ゲート・ペアは無視され、キャンセルされる可能性があった。 詳細は #13437を参照。

  • のバグを修正。 Isometry のバグを修正した。 UnitaryGate.control() のエラーにつながるバグを修正した。 UnitaryGate が2つ以上あった場合にエラーになるバグを修正。

  • 属性を使用する場合 QuantumCircuit.parameters 属性は、パラメトリック回路で QuantumCircuit.copy_empty_like() を使用した場合、属性は正しく空になります。 以前は、内部キャッシュは無効化されることなくコピーされていた。 修正 #12617

  • QuantumCircuit.depth() のようなオペランドを持たない演算も正しく処理できるようになりました。 GlobalPhaseGate.

  • QuantumCircuit.depth() は、深度計算の一部として、リアルタイム式で使用される変数とclbitsをカウントするようになった。

  • を修正しました。 SolovayKitaev 既存の .npy ファイルから基本近似値を読み込む際のトランスパイラ・パスを修正。 以前は、(ゲートのキャンセルなどによる)さらなる削減を可能にする保存された近似値をロードすると、実行時に失敗することがあった。 さらに、U(2)ゲート積とSO(3)表現の大域的な位相差は、保存-再読み込み手順の間に失われた。 修正 Qiskit/qiskit#12576.

  • SparsePauliOp.paulisPauliList が非ゼロ位相で設定されている場合、複数の SparsePauliOp メソッドを呼び出すと不正確な結果になるバグを修正した。 これで SparsePauliOp.paulisPauliList に吸収され、入力の位相は SparsePauliOp.coeffsに吸収され、入力 PauliList はゼロに設定される。

  • 引数でdraw関数が呼び出されたときにパルススケジュールを描画しない qiskit.visualization.pulse_v2.interface.draw のバグを修正。 BackendV2 引数で呼び出された場合にパルススケジュールを描画しないバグを修正しました。 V2 バックエンドはハードウェア・チャンネルの周波数を報告しないので、生成された図面は「no freq」と表示される 各チャンネルのラベルの下。

  • の問題を修正しました。 dag_drawer()DAGCircuit.draw() の問題を修正しました。 DAGCircuit インスタンスを視覚化しようとすると Var ビジュアライザーが例外を発生させる問題を修正しました。 この動作は修正され、期待される視覚化が生成されます。

  • この VF2Layout を渡すと例外が発生する。 Target を渡すと例外が発生する。 これはAer 0.13 からのターゲットの場合である。 この問題は解決されました。

  • メソッド呼び出し時のエラーを修正 Gate.repeat(). 詳細は #11990を参照。

  • 状態ベクトルが正規化されていない場合に Statevector.expectation_value() に起因するバグを修正した。

  • コンストラクタ GenericBackendV2 は、指定されたバックエンドのサイズでは割り当てられない基底ゲートを受け入れるため、不正なバックエンドを作成する可能性がありました。 つまり、1量子ビットを持つバックエンドは、2量子ビットのゲートを持つ基底を受け入れるべきではない。

  • ParameterExpression が更新され、 Python の組み込み数値型のインスタンス( floatint など)と比較する完全束縛インスタンスも、他のインスタンスと一致するハッシュ値を持つようになった。 この変更により、これらの型が辞書のキーとして互換性を持って使用できるようになった。 12488を参照。

  • OpenQASM 2パーサー(qiskit.qasm2) は、64 ビット整数に収まらない整数の条件式を扱えるようになった。 #12773 を修正。

  • インポートされた OpenQASM 2プログラムのカスタム・ゲート( gate ステートメントに由来するもの)は、実装を持つようになった。 Gate.to_matrix() 実装を持つことになる。 以前は行列の定義がなかったため、 OpenQASM 2 を経由するラウンドトリップは、ゲート行列を導き出す能力を不必要に失う可能性があった。 ただし、この行列は、内部ゲート定義の行列を再帰的に求めることによって計算される。 Operator と同じように、行列は内部ゲート定義の行列を再帰的に求めることによって計算される。

  • 以前は DAGCircuit.replace_block_with_op()n -qubitオペレーションを m qubitのブロックに置くことができ、DAGを無効な状態にすることができた。 この動作は修正され、この試行では DAGCircuitError.

  • 固定 Operator.power() シューア形式が対角でない行列(例えば、ほとんどの非ユニタリー行列)に対して非整数乗で呼び出された場合。

  • Operator.power() は、 1-1 固有値を持つユニタリー行列の分数行列のべき乗から期待される主値を、より確実に返すようになった。 浮動小数点の丸め効果によって、行列がブランチ・カットの負側に固有値を持つこ とがあり(正確な数学的関係がそうでなくても)、さまざまなBLAS呼び出しの不正確さによって、 誤ってブランチ・カットの間違った側を見つけることがあるからである。

    Operator.power() これで行列の累乗の分岐カットの位置が、 1-1 から離れた小さな複素数回転にシフトされた。これは問題を解決するのではなく、通常現れるタイプの演算子に対して、それがはるかに目立ちにくい場所にシフトしただけである。 新しい branch_cut_rotation パラメータを使用すると、これをよりコントロールできるようになる。

    13305を参照。

  • のプロセス単位の非決定性を修正した。 SparsePauliOp.to_matrix(). 合計における浮動小数点演算の正確な順序は、以前はプロセスごとに異なっていたが、同じスクリプトの異なる呼び出し間で同じになる。 13413を参照。

  • Target.has_calibration() が更新され、命令プロパティに None 、ターゲットに追加された命令に対して例外を発生させないようになった。 #12525 を修正。

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