Skip to main content
IBM Quantum Platform

Qiskit SDK 1.1 リリースノート


1.1.2

前奏曲

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

バグ修正

  • のバグを修正しました。 BitArray.from_counts() そして BitArray.from_samples(). 以前は、ゼロだけを含むデータが与えられ、オプションの引数 num_bits の値がない場合、エラーが発生した。 を生産している。 BitArrayBitArray.num_bits を1に設定した。

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

  • トランスパイラー・パスに CollectCliffords を追加した。 特に、ゲートを追加した。 ECRGate, DCXGateiSWAPGateSXGateSXdgGate を追加した。

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

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

  • の問題を修正しました。 dag_drawer()DAGCircuit.draw() の問題を修正しました。 DAGCircuit インスタンスに Var を含むインスタンスを視覚化しようとしたときの問題を修正した。 ビジュアライザーはこれを実行しようとすると例外を発生させるが、これは修正され、期待通りのビジュアライゼーションが生成されるようになった。

  • コンストラクター GenericBackendV2 は、バックエンドのサイズから割り当てることができない基底ゲートを受け入れていたため、以前は不正なバックエンドを構築することができた。 例えば、1量子ビットを持つバックエンドは、以前は2量子ビットのゲートを持つ基底を受け入れることができた。

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

  • 以前は DAGCircuit.replace_block_with_op()n-qubitの操作で m qubitのブロックに置くことができ、DAGは無効な状態のままであった。 この動作は修正され、これを実行しようとすると期待どおりに DAGCircuitError が発生するようになった。


1.1.1

前奏曲

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

バグ修正

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

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

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

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

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

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

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

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


1.1.0

前奏曲

Qiskit 1.1.0 リリースは、無数の新機能とバグ修正を含むマイナー機能リリースです。 今回のリリースのハイライトは以下の通り:

  • 型付き古典変数のサポートがQiskitの QuantumCircuit. これらの古典変数は、入力として指定することも、スコープ変数として指定することもできます。 QuantumCircuit にスコープされた変数として指定することができます。 ゲート・パラメーターや出力変数の設定などのサポートは、将来的に追加される予定である。

  • パスでトランスパイラが内部的に使用するデフォルトの2つの量子ビット合成メソッドは、Rustで再実装されました。 UnitarySynthesis パスでトランスパイラが内部的に使用するデフォルトの2つの量子ビット合成メソッドがRustで再実装されました。 これにより、2量子ビットのユニタリー行列を分解する際の実行速度が大幅に向上する。 その結果、最適化レベル3によるトランスパイルの実行時間が大幅に改善された。 UnitarySynthesis を実行すると、従来は大きな実行時間オーバーヘッドが発生していました。 このリリースでは、最適化レベル2の最適化段階の一部として UnitarySynthesis を最適化レベル2の最適化ステージの一部として実行するようになりました。

    さらに Isometry で使用されていた数値計算手法がRustに移行され、特に制御されたユニタリーゲート合成の実行速度が大幅に向上した。 マルチコントロールの分解 XGatePhaseGate の分解が改善され、合成に使用するゲート数が2桁以上減少しました。

  • Qiskitには新しいトランスパイラ・パスが多数導入されており、多くの場合、トランスパイルされた量子回路のサイズを縮小しつつ、大幅な実行速度の向上を実現している。 具体的には ElidePermutationsStarPreRouting は、ルーティングの出力品質と実行時間に大きな影響を与えることが実証されている。 RemoveFinalReset リセットを含む量子回路を改善することができる。

  • デフォルトのパス・マネージャーは、新しく導入されたトランスパイラー・パスで拡張され、改善された。 特に、 generate_preset_pass_manager から提供され、内部的に transpile() によって内部的に使用されている最適化レベル2のプリセット・パス・マネージャーは、将来のリリースでデフォルトのパス・マネージャーとして機能するように、実行時間と最適化努力のトレードオフがより良くなるようにリファクタリングされました。 このリリースでは、レベル2を使用するデフォルトは変更されていないが、通常、レベル1や3を使用するよりも良い選択である。

  • 新しいジェネリック・プリミティブ V2 の実装が追加された、 BackendEstimatorV2BackendSamplerV2既存の完全なステートベクタベースの実装を補完する。

  • プラットフォームサポートの変更: Python 3.8 は Qiskit 1.1.0 から非推奨となり、 1.3.0 ではサポートされなくなりました。 arm64 macOS はティア1サポートに昇格しました。

回路の特徴

  • メソッド QuantumCircuit.power(), Gate.power()のサブクラスのサブクラス(例えば Gate (のサブクラスの同様のメソッド(たとえば SGateなど)のサブクラス上の同様のメソッドはすべて、新しい引数 annotatedAnnotatedOperation オブジェクトを返すために使用されます。 デフォルト値の False は、既存の動作に対応する。 さらに、 power メソッドが明示的に定義されている標準ゲートでは、引数 annotated は何の効果もない。 例えば、 SGate().power(1.5, annotated=False)SGate().power(1.5, annotated=True) はどちらも PhaseGate を返す。 明示的に定義されたパワーメソッドがないゲートでは、 annotated の値に違いが現れる。 FalseUnitaryGateを返します。一方、 True の値は、「パワー修飾子」で変更された命令を表す AnnotatedOperation を返す。

  • に新しい引数 ctrl_state を追加。 QuantumCircuit.mcp() そして MCPhaseGate.

    その QuantumCircuit.mcp() メソッドと MCPhaseGate クラスが更新され、 ctrl_state パラメータが追加されました。 この機能強化により、ユーザーはマルチ制御位相ゲートの制御状態を指定できるようになりました。 このパラメータには整数値かビット列を指定することができ、指定がない場合はデフォルトで「1」の状態を制御する。

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(4)
    qc.mcp(0.2,[0,1,2],3,ctrl_state=2)
  • に新しい引数 ctrl_state を追加した。 QuantumCircuit.mcx().

    量子回路ライブラリの QuantumCircuit.mcx() 量子回路ライブラリのメソッドにctrl_stateパラメータが追加され、マルチ制御Xゲートの制御状態を指定できるようになった。 このパラメータには、10進数値またはビット列を指定することができ、指定しない場合はデフォルトで「1」の状態を制御する。

    from qiskit import QuantumCircuit
    
    qc = QuantumCircuit(3, 3)
    qc.mcx([0, 1], 2, ctrl_state="00")
  • A QuantumCircuit は型付き古典変数を含むことができるようになった:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister
    from qiskit.circuit.classical import expr, types
    
    qr = QuantumRegister(2, "q")
    cr = ClassicalRegister(2, "c")
    qc = QuantumCircuit(qr, cr)
    # Add two input variables to the circuit with different types.
    a = qc.add_input("a", types.Bool())
    mask = qc.add_input("mask", types.Uint(2))
    
    # Test whether the input variable was true at runtime.
    with qc.if_test(a) as else_:
        qc.x(0)
    with else_:
        qc.h(0)
    
    qc.cx(0, 1)
    qc.measure(qr, cr)
    
    # Add a typed variable manually, initialized to the same value as the classical register.
    b = qc.add_var("b", expr.lift(cr))
    
    qc.reset([0, 1])
    qc.h(0)
    qc.cx(0, 1)
    qc.measure(qr, cr)
    
    # Store some calculated value into the `b` variable.
    qc.store(b, expr.bit_and(b, cr))
    # Test whether we had equality, up to a mask.
    with qc.if_test(expr.equal(expr.bit_and(b, mask), mask)):
        qc.x(0)

    これらの変数は、回路の入力として指定することも、スコープ変数として指定することもできる。 回路オブジェクトは、型付けされた古典変数出力を表現するためのサポートをまだ持っていないが、これは、ハードウェアと結果のインターフェイスがよりサポートしやすい状態になったときに、後で追加される予定である。 内側スコープのブロックを表す回路は、外側スコープの変数を取り込むこともできる。

    変数は Var ノードで、任意の型を含むことができるようになり、回路に追加されると、そのライブ範囲内で一意のメモリ位置を表します。 これらの回路は QuantumCircuit.add_var()QuantumCircuit.add_input()を使うか、 Var.new() を使って低レベルで構築することができる。

    変数は、手動で Store 命令とそれに対応する回路メソッド QuantumCircuit.store(). への書き込みも含まれる。 ClbitClassicalRegister インスタンスへの書き込みも含まれます。 Var ノードへの書き込みも含まれます。

    変数は、古典的な式 ( qiskit.circuit.classical.exprを参照)が有効なところならどこでも使える。 現在のところ、これはコントロール・フロー操作の対象となる表現であるが、将来的には型と表現システムの拡張に伴い、これをゲート・パラメーターに拡大する予定である。

    これらの変数と関連するデータモデルについては、 リアルタイム・クラシック計算を参照のこと。

    これらは、QPYシリアライズ(qiskit.qpy)、 OpenQASM 3エクスポート(qiskit.qasm3)、回路ビジュアライザ( QuantumCircuit.draw()).

    新しい古典的な変数とストレージは、ハードウェアやシミュレーターのバックエンドでサポートされるようになるまで、しばらく時間がかかるだろう。 プリミティブ・インターフェイス(qiskit.primitives)ではサポートされていないが、それらのインターフェイスが進化するにつれて、それらのインターフェイスに情報を提供することになるだろう。

  • 従来のリアルタイム式モジュール qiskit.circuit.classical は、符号なし整数やビットライクのインデックス付けやビットシフトを表現できるようになった(例えば ClassicalRegister). 例えば、あるレジスタと別のレジスタのビットシフトを比較することが可能になった:

    from qiskit.circuit import QuantumCircuit, ClassicalRegister
    from qiskit.circuit.classical import expr
    
    cr1 = ClassicalRegister(4, "cr1")
    cr2 = ClassicalRegister(4, "cr2")
    qc = QuantumCircuit(cr1, cr2)
    with qc.if_test(expr.equal(cr1, expr.shift_left(cr2, 2))):
        pass

    Qiskitは、レジスタに動的にインデックスを付ける条件も表現できる:

    with qc.if_test(expr.index(cr1, cr2)):
        pass
  • の構築性能は NLocal およびその派生回路ライブラリ・サブクラス(例えば EfficientSU2RealAmplitudes)は、回転および/またはもつれサブブロックが単一のQiskit標準ライブラリゲートの単純なアプリケーションである場合、大幅に改善されました。 これらの回路は遅延的に構築されるため、クラスのインスタンス化ですぐに改善が見られるわけではなく、その内部構造への最初のアクセスで改善が見られるかもしれない。 パフォーマンス向上は10倍速のオーダーだ。

  • QuantumCircuit.append() このキーワード引数には copy があり、デフォルトは True である。 ランタイム・パラメータ(ParameterExpression)を持つ命令が回路に追加される場合、デフォルトでは、回路は常に命令のコピーを作成します。 QuantumCircuit.assign_parameters() を変更しようとしても、同じ命令への他の参照には影響しません。 現在、 copy=False を設定することで、これを上書きすることができます。そのため、あなたの指示が他の場所で使用されないことが分かっている場合は、コピーペナルティを回避することができます。

  • QuantumCircuit.compose() このキーワード引数には copy があり、デフォルトは True である。 デフォルトでは compose() はすべての命令をコピーするので、ある回路の突然変異が他の回路に影響することはない。 copy=False の場合、もう一方の回路からの命令は、新しい回路が直接所有することになる。 この場合、他の回路はその後使用してはならない。

  • 回路の構築時間は QuantumVolume 回路の構築時間は大幅に改善され、 10x またはそれ以上のオーダーとなった。 内部 SU4 ゲートも、生成時により多くのビットのランダム性を使用するようになり、特に幅と深さが大きい場合に、より代表的なボリューム回路につながる。

  • QuantumVolume は、 flatten キーワード引数を持つようになった。 Falseこの場合、構築された回路には1つの命令が含まれ、その命令には実際のボリューム構造が含まれる。 True に設定すると、回路は直接、体積の SU4 行列を持つことになる。

  • UnitaryGate オプションで num_qubits 。 この唯一の効果は、量子ビット数の推論をスキップすることであり、これは多くのゲートを構築する場合にパフォーマンス上有用である。

  • QuantumCircuit には、マニュアルの変数を扱ったり検査したりするための新しいメソッドがいくつかある。 Var 変数を使用します。

    これらすべての詳細については、「 リアルタイムのタイプされたクラシック・データを扱う 」を参照のこと。

    新しい方法とは

    さらに、これらの変数を取り囲むいくつかの新しい動的属性がある。 QuantumCircuit がある:

  • ControlFlowOp とそのサブクラスは iter_captured_vars() メソッドを持つようになりました。このメソッドは、その直前のブロックに取り込まれた一意な変数に対するイテレータを返します。

  • DAGCircuit には、マニュアルの変数を扱ったり検査したりするための新しいメソッドがいくつかある。 Var 変数を使用します。 これらはほぼ同等である。 QuantumCircuit ただし DAGCircuit メソッドはよりインタラクティブな人間の使用に特化している。 QuantumCircuit メソッドはよりインタラクティブな人間の使用に特化している。

    新しい方法とは

    新しいパブリック属性もある:

  • DAGCircuit.wires も含まれるようになった。 Var これらも古典的なデータ・フローであるためだ。

  • 新しいメソッド、 Var.new()が追加され、そのメモリを所有する古典的なリアルタイム変数を手動で構築できるようになった。

  • QuantumCircuit.compose() リアルタイム・クラシカル変数をよりよくサポートするために、 var_remapinline_captures の2つのキーワード引数が必要である。

    var_remapVar ノードを書き換えることができる。 これは名前の衝突を避けるために使うことができる。

    inline_capturesTrue (デフォルトは False )に設定することができる。 Var に設定すると、変数を再宣言することなく、引数回路で "キャプチャ "として追跡されたすべてのノードをベース回路で同じノードにリンクします。 Var にリンクさせることができる。 これは QuantumCircuit.copy_empty_like()vars_mode="captures" の処理と組み合わせることで、変数を含む回路をレイヤーごとに構築することができる。

  • DAGCircuit.compose() には新しいキーワード引数、 inline_captures がある。 True に設定することで、引数回路上の「キャプチャされた」ノードを、再宣言することなくベース回路上にインライン化することができる。 Var ノードを再宣言することなく、ベース回路上にインライン化することができる。 vars_mode="captures" いくつかの DAGCircuit オプションと併用することで、同じ変数を操作するDAGを結合することができます。

  • QuantumCircuit.copy_empty_like() そして DAGCircuit.copy_empty_like() には新しいキーワード引数 vars_modeVar ノードの追跡方法を制御する。 デフォルト ("alike") では、変数はソースと同じ入力/キャプチャ/ローカル・モードで宣言される。 すべての変数をキャプチャに変換する場合は "captures" を設定し(これは compose()で便利)、あるいは "drop" に設定すると、変数を削除することができます。

  • 新しい vars_mode キーワード引数が DAGCircuit メソッドに追加されました:

    と同じ意味を持つ。 copy_empty_like().

  • 回路ライブラリ(qiskit.circuit.library)にあるすべての "標準ゲート "を文字列名で指定できるようになった。 TwoLocal 回路 RealAmplitudes そして EfficientSU2.

プリミティブ機能

  • を実施した。 BackendEstimatorV2BaseEstimatorV2 が追加された。 この推定器は BackendV1 そして BackendV2.

    import numpy as np
    from qiskit import transpile
    from qiskit.circuit.library import IQP
    from qiskit.primitives import BackendEstimatorV2
    from qiskit.providers.fake_provider import Fake7QPulseV1
    from qiskit.quantum_info import SparsePauliOp, random_hermitian
    
    backend = Fake7QPulseV1()
    estimator = BackendEstimatorV2(backend=backend)
    n_qubits = 5
    mat = np.real(random_hermitian(n_qubits, seed=1234))
    circuit = IQP(mat)
    observable = SparsePauliOp("Z" * n_qubits)
    isa_circuit = transpile(circuit, backend=backend, optimization_level=1)
    isa_observable = observable.apply_layout(isa_circuit.layout)
    job = estimator.run([(isa_circuit, isa_observable)], precision=0.01)
    result = job.result()
    print(f"> Expectation value: {result[0].data.evs}")
    print(f"> Standard error: {result[0].data.stds}")
    print(f"> Metadata: {result[0].metadata}")
  • を実施した。 BackendSamplerV2BaseSamplerV2 が追加された。 このサンプラーは BackendV1BackendV2 をサポートしており、 memory オプションでビット列を計算できる。

    import numpy as np
    from qiskit import transpile
    from qiskit.circuit.library import IQP
    from qiskit.primitives import BackendSamplerV2
    from qiskit.providers.fake_provider import Fake7QPulseV1
    from qiskit.quantum_info import random_hermitian
    
    backend = Fake7QPulseV1()
    sampler = BackendSamplerV2(backend=backend)
    n_qubits = 5
    mat = np.real(random_hermitian(n_qubits, seed=1234))
    circuit = IQP(mat)
    circuit.measure_all()
    isa_circuit = transpile(circuit, backend=backend, optimization_level=1)
    job = sampler.run([isa_circuit], shots=100)
    result = job.result()
    print(f"> bitstrings: {result[0].data.meas.get_bitstrings()}")
    print(f"> counts: {result[0].data.meas.get_counts()}")
    print(f"> Metadata: {result[0].metadata}")
  • 複数の BitArray メソッドを追加した。

    ba = BitArray.from_samples(['00', '11'])
    print(ba)
    # BitArray(<shape=(), num_shots=2, num_bits=2>)
    
    # reshape the bit array because `concatenate` requires an axis.
    ba_ = ba.reshape(1, 2)
    print(ba_)
    # BitArray(<shape=(1,), num_shots=2, num_bits=2>)
    
    ba2 = BitArray.concatenate([ba_, ba_])
    print(ba2.get_bitstrings())
    # ['00', '11', '00', '11']
    
    # `concatenate_bits` and `concatenates_shots` do not require any axis.
    
    ba3 = BitArray.concatenate_bits([ba, ba])
    print(ba3.get_bitstrings())
    # ['0000', '1111']
    
    ba4 = BitArray.concatenate_shots([ba, ba])
    print(ba4.get_bitstrings())
    # ['00', '11', '00', '11']
  • オブジェクトのサブセットを生成するメソッドが追加された。 BitArray メソッドを追加した。

    • __getitem__()配列の既存の軸に沿ってスライスする。
    • slice_bits()ビット軸に沿って配列をスライスする。
    • slice_shots()ショット軸に沿って配列をスライスする。
    ba = BitArray.from_samples(['0000', '0001', '0010', '0011'], 4)
    print(ba)
    # BitArray(<shape=(), num_shots=4, num_bits=4>)
    print(ba.get_bitstrings())
    # ['0000', '0001', '0010', '0011']
    
    ba2 = ba.reshape(2, 2)
    print(ba2)
    # BitArray(<shape=(2,), num_shots=2, num_bits=2>)
    print(ba2[0].get_bitstrings())
    # ['0000', '0001']
    print(ba2[1].get_bitstrings())
    # ['0010', '0011']
    
    ba3 = ba.slice_bits([0, 2])
    print(ba3.get_bitstrings())
    # ['00', '01', '00', '01']
    
    ba4 = ba.slice_shots([0, 2])
    print(ba3.get_bitstrings())
    # ['0000', '0010']
  • メソッドを追加した。 transpose() メソッドを追加した。 BitArray.

    ba = BitArray.from_samples(['00', '11']).reshape(2, 1, 1)
    print(ba)
    # BitArray(<shape=(2, 1), num_shots=1, num_bits=2>)
    print(ba.transpose())
    # BitArray(<shape=(1, 2), num_shots=1, num_bits=2>)
  • 対角作用素の期待値を計算する expectation_values() 対角演算子の期待値を計算するメソッドを追加。

    ba = BitArray.from_samples(['01', '11'])
    print(ba.expectation_values(["IZ", "ZI", "01"]))
    # [-1.   0.   0.5]
  • DataBin これで Shaped プロトコルを満たす。 つまり、すべての DataBin インスタンスが追加属性

    • shape (tupleint[,...])インスタンス内の各エントリの先頭形状
    • ndim (int):長さ shape
    • size (int):以下のエントリーの積。 shape

    形状はコンストラクタに渡すことができる。

  • にマッピングのような機能を追加。 DataBinすなわち、 __getitem__, __contains__, __iter__keys(), values()そして items().

    from qiskit import QuantumCircuit
    from qiskit.primitives import StatevectorSampler
    
    circuit = QuantumCircuit(1)
    circuit.h(0)
    circuit.measure_all()
    
    sampler = StatevectorSampler()
    result = sampler.run([circuit]).result()
    databin = result[0].data
    for creg, arr in databin.items():
        print(creg, arr)
    for creg in databin:
        print(creg, databin[creg])
  • サブクラス SamplerPubResultPubResult のサブクラスが追加された。 BaseSamplerV2 のサブクラスが追加されました。 この新しいサブクラスで追加された主な機能は join_data()の内容(のサブセット)を1つのオブジェクトに結合することである。 data の内容 (のサブセット) を単一のオブジェクトに結合することです。 これにより、以下のパターンが可能になる:

    job_result =  sampler.run([pub1, pub2, pub3], shots=123).result()
    
    # assuming all returned data entries are BitArrays
    counts1 = job_result[0].join_data().get_counts()
    bistrings2 = job_result[1].join_data().get_bitstrings()
    array3 = job_result[2].join_data().array

プロバイダー機能

  • を使用しています。 BasicSimulator に含まれるpythonベースのシミュレータは basic_provider で定義された3量子ビットまでの標準ゲートの実行をサポートするようになりました。 qiskit.circuit.library.

パルス機能

  • パルス Schedule および ScheduleBlock オブジェクトに割り当てることができるようになりました。 パラメータ名を使用して、すべてのパラメータに値を割り当てることができます。 Schedule または ScheduleBlock 内にあるすべてのパラメータに値を割り当てることができる。 さらに ParameterVector のパラメータ名は、ベクトルのすべての値を同時に代入するために使用することができます(したがって、値のリストはベクトルの長さに一致する必要があります)。

  • assign_parametersScheduleScheduleBlock のメソッドは ParameterVector のメソッドは、個々のインスタンスを個々の値に割り当てるだけでなく、同時にパラメータ値のリストに割り当てることができるようになりました。 Parameter インスタンスを個々の値に割り当てることに加えて

OpenQASM 特徴

  • OpenQASM 3 エクスポーターは、マニュアル・ストレージ・ノードをサポートしている。 Var ノードをサポートしています。

QPYの特長

  • QPY (qiskit.qpy)フォーマットのバージョン12が追加されました。 Var 変数のサポートが追加されました。 フォーマットの変更の詳細については、 バージョン12をご覧ください。

量子情報の特徴

  • 新しい apply_layout() メソッドを追加した。 apply_layout(). このメソッドは TranspileLayout このメソッドはトランスパイラからのレイアウトを Pauli このメソッドは、トランスパイラからのレイアウトを入力回路用に構築されたobservableに適用するために使用されます。 これにより、 BaseEstimator / BaseEstimatorV2 の実装と局所的な転置ができるようになります。 Pauli. 例:

    from qiskit.circuit.library import RealAmplitudes
    from qiskit.primitives import BackendEstimatorV2
    from qiskit.providers.fake_provider import GenericBackendV2
    from qiskit.quantum_info import Pauli
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    psi = RealAmplitudes(num_qubits=2, reps=2)
    H1 = Pauli("XI")
    backend = GenericBackendV2(num_qubits=7)
    estimator = BackendEstimatorV2(backend=backend)
    thetas = [0, 1, 1, 2, 3, 5]
    pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
    transpiled_psi = pm.run(psi)
    permuted_op = H1.apply_layout(transpiled_psi.layout)
    res = estimator.run([(transpiled_psi, permuted_op, thetas)]).result()

    ここで入力回路は、 run() に渡される前にローカルでトランスパイルされる。 H1 Transpilationは、元の回路を2量子ビットから7量子ビットに拡張し( backend のサイズ)、そのレイアウトを順列化する。 apply_layout() を使用して、 pm.run() で実行された変換を反映します。

  • を追加する。 PauliList.noncommutation_graph()SparsePauliOp.noncommutation_graph() メソッドを追加し、非整約グラフの構築を公開し、測定オペレータのグループ化問題をグラフの色付け問題に再構成する。 これにより、ユーザーはこれらのグラフを直接扱うことができる。 SparsePauliOp.group_commuting().

  • の性能は SparsePauliOp.to_matrix() の性能は、密な形式でも疎な形式でも大幅に改善された。 デフォルトでは、 RAYON_NUM_THREADS 環境変数に従って、どちらもシステムで利用可能なスレッド並列性を利用するようになる。 新しい force_serial のブール引数を使えば、一時的にシリアル実行を強制することができる。 to_matrix().

合成機能

  • プラグイン KMSSynthesisLinearFunction オブジェクトを合成する LinearFunction オブジェクトを合成するプラグインに、 use_inverteduse_transposed の2つのオプションが追加されました。 これらのオプションは、基本的な合成アルゴリズムが実行されるマトリックスを、場合によっては反転や転置によって変更し、合成された回路を適切に調整する。 これらのオプションを変えることで、一般的に異なる合成回路が得られ、場合によってはデフォルト値よりも良い結果が得られるかもしれない。

  • プラグイン PMHSynthesisLinearFunction オブジェクトを合成する LinearFunction オブジェクトを合成するプラグインは、いくつかの追加オプションを受け付けるようになった。 オプション section_size は、基礎となる合成メソッドに渡される。 オプション use_inverteduse_transposed は、合成アルゴリズムが実行される行列を、場合によっては反転や転置によって変更し、合成された回路を適切に調整します。 これらのオプションを変えることで、一般的に異なる合成回路が得られ、場合によってはデフォルト値よりも良い結果が得られるかもしれない。

  • に新しい引数 use_dag を追加。 TwoQubitBasisDecomposer.__call__()XXDecomposer.__call__() メソッドに新しい引数 この引数は DAGCircuit を呼び出すときに TwoQubitBasisDecomposer または XXDecomposer インスタンスを呼び出すときに、デフォルトの QuantumCircuit. 例:

    from qiskit.circuit.library import CXGate
    from qiskit.quantum_info import random_unitary
    from qiskit.synthesis import TwoQubitBasisDecomposer
    
    decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="PSX")
    decomposer(random_unitary(4), use_dag=True)

    を呼び出すと DAGCircuit を返します。 TwoQubitBasisDecomposerdecomposer を返す。

  • LieTrotter.synthesize() を使うようになった。 QuantumCircuit.repeat() を使って、最初のトロッター・ステップの後にさらにトロッター・ステップの繰り返しを生成している。 これにより QuantumCircuit.compose()reps 、大規模な演算子の実行時間を大幅に短縮する。

  • 新しい合成法の追加 synth_permutation_reverse_lnn_kms() Kutin、Moulton、Smithline法を用いた線形最近傍アーキテクチャの逆順列合成法を追加。 このアルゴリズムは、 2n+22 * n + 2 の深さを持つCXゲートを用いて、 nn の量子ビット上の逆順列を線形最近傍アーキテクチャ上で合成する。

  • この TwoQubitBasisDecomposer クラスはRustで書き直され、実行時のパフォーマンスが大幅に向上した。

  • 合成クラスは TwoQubitWeylDecomposition 合成クラスはパフォーマンス向上のためにRustで書き直された。

トランスパイラ機能

  • CommutationChecker すなわち、入力量子回路の各演算は、解析ステップに進む前に行列表現がチェックされるようになった。 以前は、整流解析は物理回路に対してのみ行われていた。 さらに、各オペレーションがセッション計算ライブラリにキャッシュされるかどうかがチェックされるようになった。 例えば AnnotatedOperation を計算できるようになった。 これによって、 CommutationChecker に内部的に依存するトランスパイラ・パス、たとえば CommutativeCancellationをデフォルトのトランスパイルパイプラインの初期段階(基底変換の前)で実行できるようになります。

  • トランスパイラー・パスは ElidePermutations は、最適化レベル2と3のinitステージでデフォルトで実行されます。 直感的には SwapGatePermutationGateを削除することは、回路が短くなり、ルーティングが容易になるため、ほとんどの場合、有益である。 OptimizeSwapBeforeMeasureElidePermutationsであるため、最適化レベル3のパス・マネジャーのinitステージの一部として、 ElidePermuations パスで置き換えられている。

  • 新しい最適化トランスパイラパスを追加しました。 ElidePermutationsレイアウトステージの前に実行するように設計されており、 SwapGatePermutationGate仮想量子ビットを並べ替えることで回路を構成します。 例えば SwapGates:

    _images/release_notes-1.png

    はパスが実行されるとスワップを削除する:

    from qiskit.transpiler.passes import ElidePermutations
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3)
    qc.h(0)
    qc.swap(0, 1)
    qc.swap(2, 0)
    qc.cx(1, 0)
    qc.measure_all()
    
    ElidePermutations()(qc).draw("mpl")
    _images/release_notes-2.png

    このパスでは、 virtual_permutation_layout プロパティセットも設定され、最適化された回路の最後にある仮想量子ビットの並べ替えが保存される。

  • が追加された。 HLSConfig には2つのオプション引数が追加された。 引数 plugin_selection には、 "sequential" または "all" のどちらかを設定する。 sequential"(デフォルト)に設定すると、すべての上位レベルのオブジェクトに対して HighLevelSynthesis パスでは、指定されたメソッドがリストに現れる順番に順次検討され、オブジェクトを合成できる最初のメソッドで停止します。 all "に設定すると、指定されたすべての方法が考慮され、 plugin_evaluation_fn に従って最適な合成回路が選択される。 引数 plugin_evaluation_fn は、合成された量子回路の品質を評価するオプションの callable で、値が小さいほど良い回路であることを意味する。 None に設定した場合、回路の品質はそのサイズ(すなわち、その回路に含まれるゲートの数)となる。

    次の例は新機能を説明するものである:

    from qiskit import QuantumCircuit
    from qiskit.circuit.library import LinearFunction
    from qiskit.synthesis.linear import random_invertible_binary_matrix
    from qiskit.transpiler.passes import HighLevelSynthesis, HLSConfig
    
    # Create a circuit with a linear function
    mat = random_invertible_binary_matrix(7, seed=37)
    qc = QuantumCircuit(7)
    qc.append(LinearFunction(mat), [0, 1, 2, 3, 4, 5, 6])
    
    # Run different methods with different parameters,
    # choosing the best result in terms of depth.
    hls_config = HLSConfig(
        linear_function=[
            ("pmh", {}),
            ("pmh", {"use_inverted": True}),
            ("pmh", {"use_transposed": True}),
            ("pmh", {"use_inverted": True, "use_transposed": True}),
            ("pmh", {"section_size": 1}),
            ("pmh", {"section_size": 3}),
            ("kms", {}),
            ("kms", {"use_inverted": True}),
        ],
        plugin_selection="all",
        plugin_evaluation_fn=lambda circuit: circuit.depth(),
    )
    
    # synthesize
    qct = HighLevelSynthesis(hls_config=hls_config)(qc)

    この例では、パラメータを変えて複数の合成法を実行し、深さの点で最良の回路を選択する。 なお、 circuit.size() を最適化すると、別の回路を選ぶことになる。

  • を追加した。 CommutativeCancellation 最適化レベル2と3のプリセット・パス・マネージャーの init ステージにパスを追加。 これにより、プリセット・パス・マネージャーは、コンパイル・パイプラインの先頭で追加の論理演算をキャンセルすることができる。

  • でエンコードされた制約を受け付けるようになった。 Targettarget でエンコードされた制約を受け付けるようになりました:

    ターゲット制約は、トランスパイラ・パイプラインの他の部分との一貫性を保つために、ユーザーが提供する制約よりも優先されます。

  • 新しいメソッド Layout.inverse() これは Layout オブジェクトの逆数を取るための新しいメソッドを追加した。 新しいメソッド Layout.compose() メソッドを追加した。 Layout メソッドを追加した。 新しいメソッド Layout.to_permutation() メソッドを追加した。 Layout オブジェクトに対応する

  • トランスパイラー・パスに OptimizeAnnotated を追加した。 このリダクションでは、注釈付き操作(基本操作 と制御修飾子および逆修飾子およびべき乗修飾子のリスト から構成される AnnotatedOperation 基本操作 BB、制御、逆変換、べき乗修飾子のリスト MM )を探します:

    • 基本操作 BB を合成する必要がある(つまり、ターゲットですでにサポートされていないか、等価ライブラリに属していない)
    • BB の定義回路は、 PP - QQ - RR で表すことができる。 R=P1R = P^{-1}

    この場合、修正記号は QQ -部分にのみ移動できる。 具 体 的 な 例 と し て、制 御 さ れ た Q F T ベ ー ス の 加 算 器 は control - [QFT -- U -- IQFT] の 形 式 を と り、簡 略 し て QFT -- control-[U] -- IQFT と す る こ と が で き る。 回路の QFTIQFT 部分に対する制御を取り除くことで、トランスパイルド回路のゲート数を大幅に減らすことができる。

  • クラスに2つの新しいメソッドを追加した。 DAGCircuit クラスに qiskit.dagcircuit.DAGCircuit.op_successors() ノードの後継者へのイテレータを返す DAGOpNode へのイテレータを返す。 qiskit.dagcircuit.DAGCircuit.op_successors() ノードの前任者へのイテレータを返す DAGOpNode イテレータを返します。

  • 新しいトランスパイラー・パスを追加、 RemoveFinalResetを追加した。 Reset 演算を削除します。 例えば Resets:

    _images/release_notes-3.png

    パスが実行されると、最後のリセットは取り除かれる:

    from qiskit.transpiler.passes import RemoveFinalReset
    from qiskit.circuit import QuantumCircuit
    
    qc = QuantumCircuit(3, 1)
    qc.reset(0)
    qc.h(range(3))
    qc.cx(1, 0)
    qc.measure(0, 0)
    qc.reset(range(3))
    RemoveFinalReset()(qc).draw("mpl")
    _images/release_notes-4.png
  • 新しいトランスパイラー・パスを追加 StarPreRouting これは、スター接続の部分回路を特定し、最適な線形配線に置き換えるように設計されています。 これは、Bernstein-VaziraniやQFTなど、この回路接続性で構成される特定の回路に有効である。 例:

    _images/release_notes-5.png
    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import StarPreRouting
    
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, range(1, 5))
    StarPreRouting()(qc).draw("mpl")
    _images/release_notes-6.png

    あるいは、既存のプリセット・パス・マネージャーを拡張することもできる:

    from qiskit import QuantumCircuit
    from qiskit.transpiler import CouplingMap
    from qiskit.transpiler.passes import StarPreRouting
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    cm = CouplingMap.from_line(5)
    qc = QuantumCircuit(5)
    qc.h(0)
    qc.cx(0, range(1, 5))
    pm = generate_preset_pass_manager(2, coupling_map=cm)
    pm.init += StarPreRouting()
    result = pm.run(qc)
    result.draw("mpl")
    _images/release_notes-7.png

可視化機能

  • テキストと Matplotlib 回路ドロワー (QuantumCircuit.draw())は、手動リアルタイム変数を含む式を表示するための最小限のサポートしか持っていません。 演算と変数の初期化はまだサポートされていません。 Store 大規模な動的回路では、 OpenQASM 3 のエクスポート機能 (qasm3.dumps())を使って回路のテキスト表現を得ることをお勧めします。

各種 機能

  • Qiskit の本リリースでは、 NumPy 2.0 のサポートを最終的に完了しました。 Qiskitは当面、 NumPy 1.x、 2.x の両方をサポートし続ける。

アップグレードの注意

  • のスタイル・オプションのハード・コーディングを削除します。 plot_histogram(). これにより、 Matplotlib スタイルファイルを忠実に図に適用することができる。 Matplotlib で設定されたデフォルトを超えたいユーザーは、独自のスタイル・ファイルを作成するか、 Matplotlib Axes オブジェクトを plot_histogram に渡し、カスタマイズを後付けすることができる。

  • この transpile() 関数がアップグレードされ、バックエンドの入力を内部的に BackendV1BackendV2に内部的に変換するようにアップグレードされ、これによりトランスパイルパイプラインが Target. この変更にユーザーによる操作は必要ない。

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

  • の乱数の使い方が変更されました。 QuantumVolume の使用法が変更されたため、Qiskitの古いバージョンとこのバージョンでは固定シードに対する回路が異なります。 ランダム・ユニタリー生成では、より多くのビットのエントロピーが使われるようになったので、大規模な回路でも偏りが少なくなる。

  • 内部 UnitaryGate の定義における内部インスタンスは QuantumVolume 回路定義の内部インスタンスには label フィールドを持たなくなる。 以前は、 su4_<seed> という文字列に設定されていました。 <seed> は、そのゲートの内部Numpy pRNG インスタンスのシードを示す3桁の数字です。 ゲートから行列を取り出す必要がある場合は、単に Gate.to_matrix() メソッドを使えばよい。

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

  • 関数 make_data_bin() は、もはや DataBin サブクラスを生成して返すことはなくなりました。 代わりに常に DataBin クラスを返します。 しかし、後方互換性のために存在し続けているが、いずれは非推奨となる。 すべてのユーザーは DataBinmake_data_bin() が出力するサブクラスをインスタンス化するのではなく、直接インスタンスを構築する必要があります。

プロバイダー向けアップグレードノート

  • の実装 BackendV2 (および BackendV1の実装は run() メソッドを更新して、型付けされた古典変数を含む入力を熱心に拒否するようにしたいかもしれない( qiskit.circuit.classical参照)と Store を参照)を含む入力を拒否するようにメソッドを更新したいと思うかもしれない。 新しい Store 命令は、トランスパイラによって、常に利用可能な「ディレクティブ」として扱われます。 Barrierバックエンドがこれをサポートしていない場合は transpiler.

    詳しくはリアルタイム変数を参照。

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

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

  • そのため TwoQubitWeylDecomposition は作成時にサブクラスに自己特化しなくなった。 これは TwoQubitWeylDecomposition の内部的な詳細であり、すべてのサブクラスが同じ振る舞いをし、内部ディスパッチにのみ使用されるため、文書化されたパブリックな振る舞いではありませんでした。 しかし、これは発見可能な動作であったため、このリリースノートでは、今後はこのような現象は発生せず、すべての TwoQubitWeylDecomposition のインスタンスはすべて同じ型になります。 クラスのパブリック・メソッドの動作に変更はない。

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

  • プリセット StagedPassManager によって最適化レベル2に返される generate_preset_pass_manager()level_2_pass_manager() によって返されるプリセットは、実行時間と最適化のバランスがより良くなるように作り直された。 つまり、以前のリリースと比べると出力回路が変わるということだ。 以前のリリースのレベル2の正確なパス・マネージャーが必要な場合は、手動でビルドするか、以前のリリースのものを使用し、新しいリリースでロードするために回路を qpy で保存し、新しいリリースで読み込むことができます。

各種 アップグレードの注意

  • Windowsの最小サポートバージョンはWindows 10になりました。 以前のリリースでは、Windowsの最小サポートバージョンを明示的にリストアップしていなかったため、暗黙のうちにWindows 7、8、 8.1 が動作していた可能性があります(ただし、テストされたことはありません)。 しかし、Rust 1.78 がWindowsの旧バージョンのサポートを終了したため、Qiskitが PyPI で公開しているバイナリは、このリリースからWindowsの旧バージョンをサポートしなくなりました。 古いバージョンのWindowsを使用している場合でも、古いRustコンパイラを使用してソースからQiskitをビルドできる可能性があります(ソースからビルドするためのQiskitの最小サポートRustバージョンは現在 1.70 )が、古いバージョンのWindowsはサポートされていないプラットフォームであり、テストされていません。

非推奨のメモ

  • Python 3.8 で Qiskit を実行するためのサポートは非推奨となり、Qiskit 1.3.0 リリースで削除される予定です。 1.3.0 は、 Python 3.8 がサポート終了となった後の最初のリリースである。 [1] これは、 1.3.0 リリースから、使用している Python バージョンを Python 3.9 以上にアップグレードする必要があることを意味します。

    [1 ]https://devguide.python.org/versions/

プロバイダーの廃止予定

  • 抽象基底クラス Provider および ProviderV1 は非推奨となり、Qiskit 2.0.0 で削除される予定です。 これらのインターフェイス定義が提供する抽象化は、実質的な価値を提供するものではなく、 namebackendsget_backend() という属性をカプセル化したに過ぎない。 概念として、バックエンドの集合体として存在し続ける。 現在プロバイダーを実装している場合は、 ProviderV1 を実装の親クラスとして削除するだけで、コードを調整できる。 その一環として、後方互換性のために get_backend 。 例:

    def get_backend(self, name=None, **kwargs):
      backends = self.backends(name, **kwargs)
      if len(backends) > 1:
          raise QiskitBackendNotFoundError("More than one backend matches the criteria")
      if not backends:
          raise QiskitBackendNotFoundError("No backend matches the criteria")
      return backends[0]

合成の非推奨

  • この TwoQubitWeylDecomposition.specialize() メソッドは非推奨となり、Qiskit 2.0.0 リリースで削除される予定です。 このメソッドにはパブリックな目的はなく、エンドユーザーが呼び出すと、オブジェクト内の計算分解が変異し、オブジェクト内に無効なフィールドが生成されるため、安全ではなかった。 これは、新しい TwoQubitWeylDecomposition オブジェクトを構築するためにのみ使用される。 にもかかわらず、このクラスのパブリックAPIの一部として文書化されていた。 このリリースでは、クラスのRust書き換えの一環として特殊化サブクラス化が削除されたため、呼び出されると常に NotImplementedError

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

  • パス qiskit.transpiler.passes.CXCancellation は廃止され、より汎用的な InverseCancellationより汎用的な CXCancellation は意味的に InverseCancellation([CXGate()]) と完全に等価である。

  • トランスパイルパス qiskit.transpiler.passes.ALAPSchedule は非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 で置き換えられる。 ALAPScheduleAnalysisこれは分析パスである。

  • トランスパイルパス qiskit.transpiler.passes.ASAPSchedule は非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 に取って代わられた。 ASAPScheduleAnalysis と新しいスケジューリングワークフローに取って代わられました。

  • トランスパイルパス qiskit.transpiler.passes.DynamicalDecoupling は非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 代わりに PadDynamicalDecouplingこれは同じ機能を実行するが、その前にスケジューリングとアライメント解析のパスを実行する必要がある。

  • トランスパイルパス qiskit.transpiler.passes.AlignMeasures は非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 代わりに ConstrainedRescheduleを使う。

可視化の非推奨機能

  • タイムライン引き出しのパラメータ show_idleshow_barrier は、回路引き出しのパラメータに合わせて、それぞれ idle_wiresplot_barriers に置き換えられていた。 以前の名称は非推奨となり、次回のメジャーリリースで削除される。 新しいパラメータは完全に同等である。

バグ修正

  • 関数の問題を修正した。 qpy.dump() 関数の問題を修正しました。 use_symengine フラグが True と評価される真理値オブジェクトに設定されていますが、実際にはブール値 True ではなかった場合、生成される QPY ペイロードが破損していました。 例えば、 use_symengineHAS_SYMENGINEに設定すると、このオブジェクトはboolとしてキャストされたときに True と評価されるが、実際には True

  • の問題を修正しました。 circuit_drawer() 関数と QuantumCircuit.draw() メソッドの問題を修正しました。

  • 回路に ConstrainedReschedule トランスパイラ・パスが、回路に Reset 命令が含まれている場合、トランスパイラ・パスがエラーになる問題を修正しました。 これは修正され、パスのエラーはなくなりましたが、実際のハードウェアはQiskitスケジューラが想定している動作とは異なる場合があります。 Qiskitスケジューラは、以下のいずれかを含む回路に遭遇した場合、 RuntimeWarning 。 修正 #10354

  • CommutationChecker 、ゲートの属性が。 name 属性が UTF8 エンコードされているとエラーになる問題を修正した。 以前は、asciiエンコーディングのゲート名しか機能しなかった。 修正 #12501

  • の問題を修正しました。 SparsePauliOp.apply_layout()Pauli.apply_layout() メソッドで、 layout 引数に重複または負のインデックスを持つ無効な配列が渡された場合の問題を修正しました。 以前はエラーにならず、実行された変換は有効ではなかった。 これらのメソッドは QiskitError を発生させるようになりました。

  • のパフォーマンスの問題を修正しました。 BackendSamplerV2 そして BackendEstimatorV2. 修正 #12290

  • の問題を修正した。 convert_to_target() コンバーターが、 BackendConfiguration.supported_instructions 属性に制御フロー命令を指定すると、制御フロー命令を誤って無視してしまう問題を修正しました。 BackendConfiguration オブジェクトで指定される典型的な場所です。 #11872 を修正。

  • の問題を修正しました。 circuit_drawer() または QuantumCircuit.draw()mpl 出力オプション使用時、描画される回路に ControlFlow 操作があり、 fold オプションが -1 (折り返しがない) に設定されている場合、プログラムがハングする問題を修正しました。 修正 #12012

  • カスタム・パルス命令のレガシー形式への変換におけるバグを修正。 qiskit.qobj フォーマットへの変換のバグを修正しました。 このバグはQiskit 1.0.0 で導入されたもので、カスタムパルス形状の命令を変換するとエラーが発生する。 修正後、変換は正しく実行され、カスタムパルスは本来のように Waveform に変換されます。 #11828 を修正。

  • のバグが修正されました。 transpile() 型のバックエンドと同時に提供された場合、カスタムの instruction_durations, dt , backend_properties 制約が無視されるバグが修正されました。 BackendV2. 修正後の動作は、提供されたバックエンドの型が BackendV1 型か BackendV2. 同様に、カスタム timing_constraints は、 target 入力によってオーバーライドされるようになった。 BackendV1BackendV2 入力よりも優先される。

  • を呼び出すと EquivalenceLibrary.set_entry() を呼び出すと、ライブラリーの内部グラフ・オブジェクトが正しく更新されるようになった。 以前は、メタデータは更新されたが、グラフ構造は変更されなかった。 BasisTranslator のようなユーザーは古いルールを使い続けることになる。 #11958 を修正。

  • これにより EvolvedOperatorAnsatz は、演算子の引数が空リストの場合を正しく処理するようになった。 以前はエラーになっていた。

  • これからは EvolvedOperatorAnsatz は、量子ビットがゼロのときにはqregを持たない。 QuantumRegister インスタンスを持つ代わりに この動作は、スーパークラスとの整合性をより高めています。 QuantumCircuit.

  • メソッド Instruction.repeat() メソッドは condition を外側の返された Instruction に移動し、その定義の内側のゲートは無条件のままにする。 以前は ClassicalRegister インスタンスを内部定義に残していましたが、これは無効な状態であり、後でトランスパイルやエクスポートの際など、一見無関係なバグとして現れていました。 #11935 を修正。

  • の問題を修正しました。 InverseCancellation トランスパイラ・パスの問題で、パラメータ値が一致していなくても、自己逆パラメータ化されたゲートを誤ってキャンセルしてしまう場合がある問題を修正しました。 修正 #11815

  • ゲートの分解を改善する MCXGateMCPhaseGate の数が指数関数的ではなく、量子ビット数に対して二次関数的に増加するように。 CXGate の数が指数関数的ではなく、量子ビットの数に対して二次関数的に増加するようにする。

  • をクラッシュさせるバグが修正されました。 convert_to_target()T1 T2 関数がクラッシュするバグが修正された。 の欠落しているプロパティ値は QubitPropertiesNone で埋められる。

  • BasePassManager.run() は、以前の PropertySet を複数回呼び出した場合でも、新しいワークフローに前のワークフローが漏れることはなくなった。 以前は PropertySet を使用していたため、無効なプロパティ情報がタスクに与えられていた可能性があった。 Qiskit 0.44 の動作と一致するようになった。 #11784 を修正。

  • Pauli.evolve() ECRゲートを含む量子回路が正しく処理されるようになった。 以前はクリフォード・ゲートと認識されておらず、誤りがあった。

  • のバグを修正した。 Pauli.evolve() で、特定のクリフォードゲート('cx'、'cz'など)と一致する名前の回路によって進化させると、回路の内容ではなく、回路の名前に従ってパウリを進化させてしまうというバグを修正した。 このバグは、デフォルトでないオプション frame='s' でのみ発生する。

  • のパフォーマンスに関する問題を修正しました。 qpy.load() 関数のパフォーマンスの問題を修正しました。

  • default_alignment 引数の処理のバグを修正。 build(). タイプの入力 AlignmentKind 型の入力は、デフォルトのアラインメントとして正しく処理されるようになりました。

  • qiskit.pulse.utils.format_parameter_value() 関数において、意図せずに十分な大きさの整数値を float 値に変換したり、予期しない丸めを行うバグを修正。 詳細は #11971を参照。

  • クラスの問題を修正しました。 QDrift クラスの問題を修正しました。ハミルトニアンの係数が、以前は各係数の絶対値を取ることによって正になるように強制されていました。 これは、負の係数の符号を足し直すように修正された。

  • convert_durations_to_dt() において、回路の持続時間に対して、属性の元の単位とは無関係に、秒から dt への変換がやみくもに適用されるバグが修正されました。 これは、報告された回路の持続時間に誤った桁をもたらす可能性がある。

  • 修正 SparsePauliOp.apply_layout() ゼロ量子ビット演算子で正しく動作するように修正。 例えば、以前に0量子ビットを作成し、次のようなレイアウトを適用したとする:

    op = SparsePauliOp("")
    op.apply_layout(None, 3)

    というエラーが出ていたはずだ。 これで、演算子は正しく返されるようになった: SparsePauliOp(['III'], coeffs=[1.+0.j])

  • トランスパイラー・パスの Commuting2qGateRouter トランスパイラ・パスのqreg順列がパス・プロパティ・セットに追加されなかったため、ユーザーが手動で追跡する必要があった。 これで、出力回路の layout プロパティを通じて並べ替えにアクセスし、情報を失うことなくパスを任意のトランスピレーション・パイプラインにプラグインすることが可能になった。

  • 特定のパルス単位を秒とナノ秒の間でスケーリングする際の浮動小数点の不正確さを修正。 パルスが記号的に定義されていた場合、 symengine の特定のビルドに対するスケーリングによって不要な浮動小数点エラーが発生する可能性があり、記号が完全にバインドされた後に予期しない結果が現れる可能性がある。 修正 #12392

  • のプリセット・パス・マネージャは transpile() は、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合、制御フローを持つ回路で失敗しなくなります。 このような抽象的なターゲットは、すべてのコントロールフロー操作を許可するものとして扱われる。 #11906 を修正。

  • メソッド qiskit.instruction.Instruction.soft_compare() は、2つのゲートの名前、量子ビット数、ビット数、パラメーターの数が一致するかどうかを比較するためのものである。 しかし、qubitsの数とclbitsの数が一致するかどうかをチェックしないタイプミスがあった。 これで明らかなタイプミスは解消された。

  • デフォルトの init プラグインは、無効な最適化レベルで呼び出されたときに TranspilerError を適切に発生させていませんでした。

  • コンストラクタの Operator.from_circuit() コンストラクタのメソッドで、最終的なレイアウト順列が正しく解釈されず、結果として無効な Operator が構築される問題を修正しました。 以前は、最終レイアウトは初期レイアウトを無視して処理されていました。つまり、初期レイアウトが自明でない量子回路では、初期化が正しく行われていませんでした。

  • のパフォーマンスの問題を修正した。 PassManager.run() のパフォーマンスの問題を修正しました。 をシリアライズするのに時間を費やすことはない。 PassManager (これは並列実行のための必要条件である)。

  • Parameter が更新され、比較するインスタンスが常に同じハッシュを持つようになった。 以前は Parameter.uuid だけが比較されていた。 Parameter のインスタンスが、 uuid パラメータ(通常は明示的に渡されない)に共通の値を使用して構築されていた場合、異なる名前のインスタンスを等しく比較することができました。

  • plot_coupling_map() 、カップリング・マップのエッジの色がおかしくなっていたバグを修正。 修正 #12369

  • OpenQASM 2.0 パーサー (qasm2.load()qasm2.loads()) は、システム・サイズの整数をオーバーフローするような整数オペランドを含むゲート角式を評価できるようになりました。 これらは倍精度浮動小数点のコンテキストで評価される。 しかし、任意に大きな整数は、必ずしも倍精度浮動小数点で正確に表現できるわけではないので、回路がどのように生成されたとしても、すでにすべての数値精度をmodulo 2π2\pi で失っている可能性がある。

  • ParameterOpenQASM 3プログラムの input 変数の代名詞として使用されるインスタンスは、 OpenQASM 3へのエクスポート時に組み込みゲートとの衝突を避けるため、名前がエスケープされるようになりました。 以前は名前の衝突が起こり、エクスポータが無効な OpenQASM 3を生成することがあった。

  • のバグを修正。 QuantumCircuit.draw() を修正しました。 Matplotlib ドロワーのカスタムスタイル辞書が実行時に変更される原因となっていました。

  • QuantumCircuit.append() インスタンスによってパラメータ化された命令は、 copy=True (デフォルト)で正しくコピーされるようになりました。 ParameterExpression インスタンスではなく Parameter インスタンスだけでなく

  • カスタム回路キャリブレーションの内部処理と InstructionDurations の内部処理は transpile() 関数から個々のトランスパイラ・パスにオフロードされています: DynamicalDecoupling DynamicalDecoupling。以前は、回路較正からの命令持続時間は、instruction_durations入力引数に手動で組み込まれない限り考慮されませんでしたが、それが必要なパスは回路を分析し、次の優先順位に従って最も関連性の高い持続時間値を選択するようになりました:ターゲット>カスタム入力>回路較正。

  • のバグを修正した。 transpile()dt または instruction_durations が指定された場合のみ num_processes 引数が使用されるバグを修正。

その他の注意事項

  • arm64 macOS プラットフォームのサポートがティア3からティア1に昇格した。 以前は、プラットフォーム上でQiskitをテストするための利用可能なCI環境がなかったため、プラットフォームはTier 3でした。 Githubが arm64 macOS 環境をオープンソース・プロジェクト [1] に提供したことで、私たちは他のTier 1がサポートするプラットフォームとともに、このプラットフォームをテストしている。

    [1 ]

    https://github.blog/changelog/2024-01-30-github-actions-introducing-the-new-m1-macos-runner-available-to-open-source/


1.0.0rc1

プロバイダー向けアップグレードノート

  • 非推奨の qiskit.providers.fake_provider モジュールは qiskit-ibm-runtime Python パッケージに移行されました。 このため qiskit.providers.fake_provider の以下の要素はQiskitで非推奨となったため削除されました。 0.46:

    • qiskit.providers.fake_provider.FakeProvider
    • qiskit.providers.fake_provider.FakeProviderForBackendV2
    • qiskit.providers.fake_provider.FakeProviderFactory
    • qiskit.providers.fake_provider.fake_backends.FakeBackendV2
    • qiskit.providers.fake_provider.backends に含まれる偽のバックエンド(プロバイダーを通してアクセスできる)
    • qiskit.providers.fake_provider.FakeQasmSimulator
    • qiskit.providers.fake_provider.FakeJob
    • qiskit.providers.fake_provider.FakeQobj

    新しい偽プロバイダモジュールを使用するには、 pip install qiskit-ibm-runtime を実行し、qiskit のインポートパス (qiskit.providers.fake_provider) を新しいインポートパス (qiskit_ibm_runtime.fake_provider) に置き換えます。移行例:

    # Legacy path
    from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()
    
    # New path
    # run "pip install qiskit-ibm-runtime"
    from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke
    backend1 = FakeProvider().get_backend("fake_ourense")
    backend2 = FakeSherbrooke()

    さらに、特別なテスト目的で設計された以下の偽のバックエンドは、新しい GenericBackendV2 クラスに取って代わられ、Qiskit では非推奨となったため削除されました。 0.46:

    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2
    • `qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitProps
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2
    • qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple

    新しいクラスへの移行例 GenericBackendV2 クラスへの移行例です:

    # Legacy path
    from qiskit.providers.fake_provider import FakeBackend5QV2
    backend = FakeBackend5QV2()
    
    # New path
    from qiskit.providers.fake_provider import GenericBackendV2
    backend = GenericBackendV2(num_qubits=5)
    # note that this class will generate 5q backend with generic
    # properties that serves the same purpose as FakeBackend5QV2
    # but will generate different results
このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。