Skip to main content
IBM Quantum Platform

Qiskit SDK 2.1 リリースノート


2.1.2

前奏曲

Qiskit 2.1.2 は小さなパッチリリースで、 2.1 シリーズで見つかったいくつかのバグを修正しています。

バグ修正

  • Qiskit 2.1.0 では VF2PostLayoutoptimization_level=3 トランスパイラーパスがプリセットパスマネージャーの optimization ステージに追加されました。 しかし、パスの出力が回路に適用されることはなかった。 このリリースでは、プリセット・パス・マネージャーの optimization ステージからパスを削除し、ランタイム・コストを節約している。 Qiskit 2.2.0 では、パスは optimization ステージの一部となり、パスがより良いレイアウトを見つけた場合に出力が適用されます。

  • トランスパイラー・パスの問題を修正しました。 VF2Layout トランスパイラー・パスの問題で、固定されたシード・セットであってもパスからの出力が非決定的になる可能性がある問題を修正しました。 14729を修正

  • のバグを修正。 PassManager.run() 複数の回路を使用している場合に callback 関数が呼び出されないバグを修正。 並列実行を含め、各回路の各パスでコールバックが正しくトリガーされるようになりました。

  • final_layout プロパティを設定する組み込みトランスパイラ・パスは、このフィールドがすでに設定されている場合、そのフィールドの更新を正しく処理するようになりました。 これは、メソッド TranspileLayout.routing_permutationfinal_layout が正しい順列を返すようになった。

    への通常の呼び出しには影響しない。 transpile() または generate_preset_pass_manager() Qiskitの組み込みプラグインを使用した通常の呼び出しには影響しませんでした。この形式で構築されたパイプラインでは、 final_layout を複数回設定しようとすることはありません。

  • のバグを修正しました。 Target.instruction_supported()operation_nameparameters の引数が既存の命令と一致するメソッドが呼び出された場合、命令の量子ビット順序のチェックがスキップされるというバグを修正しました。

  • ps の単位を使用した遅延命令のある回路を QASM3 にエクスポートする際の正しさのバグを修正。

  • 回路表示のエッジケースを修正。 QFT 回路の表示のエッジケースを修正しました。 以前は QFT.inverse() が呼び出され、QFT回路の属性が変更されると、QFTの名前は "IQFT_dg" と表示されていました。 これは誤りであり、現在は "IQFT" を正しく表示している。 修正 #14758

  • qk_circuit_get_instructionqk_circuit_instruction_clear を使用する際のメモリリークを修正。

  • で指定されたバージョンが無効であった場合のエラーメッセージを明確化した。 qpy.dump() のエラーメッセージを明確にした。

  • を修正しました。 generate_preset_pass_manager() 関数の問題を修正しました。 Targetbackend オブジェクトに含まれるタイミング制約データを誤って無視する問題を修正しました。 修正 #14329

  • のバグを修正した。 SparsePauliOp.simplify() メソッドが重複を結合する前に係数の大きさに基づいてパウリ項を削除していたバグを修正。 このため、2つの重要なエッジケースで誤った動作が発生した:

    1. 複数の同一のパウリ項が、個々には単純化しきい値以下であるが、その合計がしきい値を超える小さな係数を持つ場合、それらの項は誤って削除された。
    2. 複数の同じパウリ項の係数がしきい値を超えているが、和がゼロに近い場合、それらは誤って保持された。

    詳細は #14194を参照。


2.1.1

前奏曲

Qiskit 2.1.1 は小さなパッチリリースで、 2.1 シリーズで見つかったいくつかのバグを修正しています。

バグ修正

  • のバグを修正した。 DAGOpNode を含む2つの DAGOpNode 命令を含む BoxOp 命令を含む2つのオブジェクトを比較する際のバグを修正しました。 以前は、 BoxOp.unit 属性は等価性チェックの一部として考慮されなかったため、2つの不等なノードが等しいと評価される可能性があった。

  • Qiskit をインポートする際、 Python 3.9 の非推奨警告がユーザーコードに起因するものとして正しく識別されるよう修正。 以前は、ユーザーコードが原因であることが識別されず、 Python のデフォルト警告フィルターがユーザーに警告を表示しなかった。

  • max_trials 引数の動作を修正。 VF2LayoutNone の引数の動作を修正。 このパスは、オプションが None に設定されている場合、回路またはターゲットのサイズに基づいて検索が制限され、負の値を受け入れることで無制限の検索が指定されることが文書化されていた。 しかし、 2.1.0、この動作が誤って変更されたため、 None 、境界のない検索が実行され、負の数を使用するとエラーが発生するようになった。 これらの見落としは修正され、パスはドキュメント通りに動作し、以前のリリースと一貫性が保たれるようになった。

  • 高位合成プラグインの問題を修正 MCXSynthesis1DirtyKG24MCXSynthesis2DirtyKG24MCXGateプラグインが利用可能なクリーン補助量子ビットを利用可能なダーティ補助量子ビットとみなしていなかった問題を修正しました。 特に、プラグイン MCXSynthesis2DirtyKG24 は、1つのクリーンな補助量子ビットと1つのダーティな補助量子ビットが利用可能な場合には適用されなかった。

  • 多数の部分式を結合してインクリメンタルに構築する際のパフォーマンスの問題を修正しました。 ParameterExpression をインクリメンタルに構築する際のパフォーマンスの低下を修正しました。 14653を修正


2.1.0

前奏曲

Qiskit v2.1 リリースでは、C API、トランスパイラ機能、量子回路の使いやすさなど、主要な分野でいくつかの重要な機能強化が行われています。 さらに、多くの一般的な改良とバグ修正も含まれている。 主なハイライトは以下の通り:

  • C API 拡張: 前リリースで開始された作業を基に、Qiskit v2.1、C API関数による量子回路の作成と相互作用のサポートが追加され、標準ゲート、標準命令、ユニタリーゲートの追加がサポートされます。 オブジェクトを構築し操作するためのC関数のセットもこのリリースで追加されました。 Target これは、次のリリースで C API ベースの完全なトランスパイルワークフローをサポートするための準備です。 さらに QkComplex64 は構造体として定義され、QiskitのC APIを使用する際にコンパイラに依存しない複素数表現として機能するようになりました。 C API のヘッダーファイルも更新され、C++でネイティブに使用できるようになった。
  • Clifford+T基底セットのサポート: Clifford+Tゲートを持つターゲットのトランスパイル回路がすぐにサポートされるようになりました。 基底セットがClifford+Tゲートのみで構成されている場合、Qiskitはこれらのゲートを処理するための適切なパスがプリセットパスマネージャに追加されるようにします。 これは、フォールト・トレラントなバックエンドのためのトランスピレーションをサポートするための最初のステップである。
  • *の強化 *BoxOp:このバージョンでは、カスタム注釈を添付する機能が追加されました。 BoxOpOpenQASM のボックスステートメントの概念をさらにサポートします。 これには、QASM形式とQPY形式の両方での注釈シリアライズも含まれる。 さらに、ボックス内でストレッチ・デュレーションを使用できるようになった。
  • Python 3.9 deprecation: Python 3.9 は Qiskit v2.1 から非推奨となり、 Qiskit v2.3 ではサポートされなくなります。

上記およびその他の詳細については、以下のリリースノートおよび更新されたドキュメントをご覧ください。

C API の機能

  • Qiskit C API ( qiskit.h ) が量子回路の構築と相互作用をサポートするようになりました。 回路CのAPIは、回路を表す QkCircuit 不透明型を中心としている。 QkCircuit 、Qiskit内部のRustデータモデルでネイティブに定義された回路要素で回路を構築することができます。 QuantumCircuit. これには現在、 スタンダード・ゲートが含まれている、 Measure, Delay, Reset, Barrierおよび UnitaryGate. QiskitのデータモデルがRustの内部データモデルにネイティブに追加され、C APIで使用できるようになると、回路C APIの機能は将来のリリースで拡張されます。

    例えば、C APIを使って1000量子ビットのGHZ状態を構築することができる:

    #include <qiskit.h>
    
    int main() {
        // Create an empty circuit with 1000 qubits and 1000 clbits
        QkCircuit *qc = qk_circuit_new(1000, 1000);
    
        // Add a Hadamard Gate on Qubit 0
        uint32_t one_qubit[1] = {0,};
        qk_circuit_gate(qc, QkGate_H, one_qubit, NULL); // The NULL pointer is for the parameter array.
                                                        // Since Hadamard doesn't have parameters it
                                                        // is never accessed.
    
        // Add the CX Gates:
        uint32_t qubits[2] = {0, 0};
        uint32_t num_qubits = qk_circuit_num_qubits(qc);
        for (int i = 1; i<num_qubits; i++) {
            qubits[1] = i;
            qk_circuit_gate(qc, QkGate_CX, qubits, NULL);
        }
    
        // Add the measurements:
        uint32_t num_clbits = qk_circuit_num_clbits(qc);
    
        for (uint32_t i = 0; i<num_clbits; i++) {
            qk_circuit_measure(qc, i, i);
        }
        qk_circuit_free(qc);
        return 0;
    }
  • Qiskit C API ( qiskit.h ) は、トランスパイルターゲットを表す Target の構築をサポートするようになりました。 例:

    #include <qiskit.h>
    #include <math.h>
    
    int main() {
        // Create a Target with 3 qubits
        QkTarget *target = qk_target_new(3);
    
        // Create a Target Entry for a CX Gate
        QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX);
        // Define properties for CX between qubits (0, 1) with a duration of 1.93e-9 sec and error rate 3.17e-10.
        uint32_t qargs[2] = {0, 1};
        qk_target_entry_add_property(cx_entry, qargs, 2, 1.93e-9, 3.17e-10);
        // Define properties for cx between qubits (1, 0) with a duration of 1.27e-9 sec and no error.
        uint32_t rev_qargs[2] = {1, 2};
        qk_target_entry_add_property(cx_entry, rev_qargs, 2, 1.27e-9, NAN);
        // Add the cx entry to the target.
        QkExitCode result_cx = qk_target_add_instruction(target, cx_entry);
        // Add global ideal Y gate entry to the target
        QkExitCode result_y = qk_target_add_instruction(target, qk_target_entry_new(QkGate_Y));
        // Create a Target entry for a Measurement with increasing duration and error as the qubit indices increase
        QkTargetEntry *measure = qk_target_entry_new_measure();
        for (uint32_t i = 0; i< qk_target_num_qubits(target); i++) {
            uint32_t q[1] = {i};
            qk_target_entry_add_property(measure, q, 1, 1e-6 * (i + 1), 1e-3 * (i + 1));
        }
        QkExitCode result_measure = qk_target_add_instruction(target, measure);
        return 0;
    }
    
  • 以下のマクロを使用して、C APIからQiskitのバージョン情報を照会できるようにした:

    • QISKIT_VERSION_MAJOR メジャーバージョン番号を含む。
    • QISKIT_VERSION_MINOR マイナーバージョン番号。
    • QISKIT_VERSION_PATCH パッチのバージョン番号。
    • QISKIT_VERSION バージョン情報を数値で表し、比較に使用できる。
    • QISKIT_VERSION_NUMERIC(M,m,p) : バージョン " M.m.p " を数値として返す関数のようなマクロで、比較に使用できる。

    例えば、現在のバージョンが少なくとも 2.1.0 であるかどうかをチェックするには、次のようにする:

    if (QISKIT_VERSION >= QISKIT_VERSION_NUMERIC(2, 1, 0)) {
        // Code for version 2.1.0 or later
    }
  • C API の C++ 互換性を有効にした。 生成されたヘッダーは、C++からオブジェクトや関数を直接呼び出せるようになった。 例えば、最初の3量子ビットにXYZという項を持つ100量子ビットの可観測量は次のように構成できる

    #include <iostream>
    #include <complex>
    #include <vector>
    #include <qiskit.h>
    
    int main() {
        uint32_t num_qubits = 100;
    
        // Use smart pointer with custom deleter to manage QkObs memory
        QkObs *obs = qk_obs_zero(num_qubits);
    
        // Construct the observable term
        std::complex<double> coeff_complex = 2.0;
        QkComplex64 coeff = qk_complex64_from_native(coeff_complex);
        std::vector<QkBitTerm> bit_terms = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        std::vector<uint32_t> indices = {0, 1, 2};
    
        QkObsTerm term {
            .coeff      = coeff,
            .len        = bit_terms.size(),
            .bit_terms  = bit_terms.data(),
            .indices    = indices.data(),
            .num_qubits = num_qubits
        };
    
        qk_obs_add_term(obs.get(), &term);
    
        // Print observable properties
        std::cout << "num_qubits: " << qk_obs_num_qubits(obs) << "\n";
        std::cout << "num_terms: "  << qk_obs_num_terms(obs)  << "\n";
    
        qk_obs_free(obs);
        return 0;
    }

回路の特徴

  • 関数 random_circuit_from_graph() interaction_graphで指定されたものと同じ相互作用グラフを誘導するランダムな回路を生成する関数を追加した。

    相互作用グラフから2量子ビットゲートとしてランダムにエッジを引く確率は、入力相互作用グラフのエッジのweight属性でユーザーが設定できる。 ユーザーが確率を設定しない場合、各辺は一様に描かれる。 つまり、相互作用グラフのエッジで表される各2量子ビットゲートは、ランダム回路に追加される確率が同じである。 エッジ確率のサブセットしか設定されていない場合、 ValueError

    この例では、 cp_map は任意の重みを持つエッジのリストである。

    from qiskit.circuit.random.utils import random_circuit_from_graph
    import rustworkx as rx
    pydi_graph = rx.PyDiGraph()
    n_q = 5
    cp_map = [(0, 1, 0.18), (1, 2, 0.15), (2, 3, 0.15), (3, 4, 0.22)]
    pydi_graph.extend_from_weighted_edge_list(cp_map)
    # cp_map can be passed in directly as interaction_graph
    qc = random_circuit_from_graph(interaction_graph = pydi_graph,
      min_2q_gate_per_edge = 1,
      max_operands = 2,
      measure = True,
      conditional = True,
      reset = True,
      seed = 0,
      insert_1q_oper = True,
      prob_conditional = 0.21,
      prob_reset = 0.1)
    qc.draw(output='mpl')
    _images/release_notes-1.png
  • 新しい QuantumCircuit メソッドを追加した: QuantumCircuit.has_control_flow_op() 新しいメソッド QuantumCircuit メソッドを追加しました。

  • 新しいモジュール qiskit.circuit.annotation と原則オブジェクト Annotation が追加された。

    アノテーションは、指示(現在は BoxOp)にユーザー独自のローカルデータを付加する方法である。 このデータは、カスタム・トランスパイラー・パスが消費することを意図している。 アノテーションは、コンパイル時にグローバル・コンテキスト・オブジェクトを使用するのではなく、特定の命令にデータを付加する方法を提供する。 PropertySet を使うのではなく、特定の命令にデータを付加する方法を提供します。

    すべての Annotation すべてのオブジェクトは namespace フィールドを持っている。 この文字列キーはルックアップに使用され、コンシューマが特定の注釈を扱うかどうかを知ることができる。 現在のところ、サブクラスの抽象的なセマンティクスを問い合わせるメソッドはありません。 Annotation サブクラスの抽象的なセミックスを問い合わせるメソッドはありませんが、将来的に拡張されることが期待されています。

    詳細については qiskit.circuit.annotation を参照のこと。

  • BoxOp インスタンス QuantumCircuit.box()によって作成された)インスタンスは、カスタム Annotation インスタンスでアノテーションできるようになりました。 2つのボックスが等しいかどうかは、注釈が等しいかどうかに依存する。

    一般的には、次のように、唯一の位置引数としてアノテーションのリストを渡すことで実現します。 QuantumCircuit.box() をコンテキスト・マネージャ形式で使うときに、唯一の位置引数としてアノテーションのリストを渡すことで実現します:

    from qiskit.circuit import annotation, QuantumCircuit
    
    class MyAnnotation(annotation.Annotation):
        namespace = "my.annotation"
    
        def __eq__(self, other):
            return isinstance(other, MyAnnotation)
    
    qc = QuantumCircuit()
    with qc.box([MyAnnotation()]):
        pass
  • この UnitaryGate.control() メソッドは内部的に qs_decomposition() の代わりに Isometry を使うようになった。 UnitaryGate. この変更により CXGate の数を減らすことができる。 definition の数を減らすことができる。 ControlledGate を約 2x。

  • マルチ制御の合成を改善。 U1Gateの合成を改良し、コントロールの数によって指数関数的に大きくならないようにした。

  • BoxOp.duration 属性は expr.Expr ノードのように DurationDelay.durationを持つノードにすることができるようになりました。 これには以下のサポートも含まれる。 Stretch の期間中 BoxOp.

プリミティブ機能

  • の入力として使用されるエスティメーターPUBは、以下のように定義できるようになった。 BaseEstimatorV2.run() への入力として使われるPUBは SparseObservablePUB オブジェクトを使って定義できるようになった。 これは、すでにサポートされているタイプに追加される: str, Pauli, SparsePauliOpおよび str または Paulifloat の値にマッピングする。 ただし SparseObservable がプロジェクターを含んでいる場合、その処理のサポートはプリミティブの実装に依存する。 このリリースでは、Qiskit (StatevectorEstimator および BackendEstimatorV2)、 qiskit-ibm-runtime (qiskit_ibm_runtime.EstimatorV2)、およびQiskit Aerの(qiskit_aer.primitives.EstimatorV2)のプリミティブ実装はまだ射影観測値をサポートしていません。 投影観測量とは、用語を含む観測量である: 0 1, +, -, r, または l.

  • クラスをシリアライズ可能にするために DataBin クラスをサポートして pickle. これによって PrimitiveJobPrimitiveResult クラスを pickle でシリアライズ可能になる。

OpenQASM 特徴

  • qasm3.dump() そして qasm3.dumps()annotation_handlers のインスタンスを提供するために使われる。 annotation.OpenQASM3Serializer のインスタンスを OpenQASM 3 エクスポート・プロセスに提供するために使用されます。 Annotation オブジェクトを OpenQASM 3 にシリアライズすることができる。

  • qiskit_qasm3_import>=0.6.0qasm3.load()qasm3.loads()annotation_handlers のインスタンスを提供するために使われる。 annotation.OpenQASM3SerializerOpenQASM のインスタンスを提供するために使われる。 AnnotationOpenQASM 3からカスタム・オブジェクトをデシリアライズできる。 このサポートは現在 box ステートメントに限定されています。これはQiskitがデータモデルでアノテーションを表現できる唯一の場所だからです。

QPYの特長

  • 新しいQPYフォーマット・バージョン15を追加。 Annotation オブジェクトのサポートを含む、新しいQPYフォーマットバージョン15を追加しました。 このフォーマットは、そのようなシリアライザーがステートフルであることを可能にし、バイナリ・フォーマット内の安全な場所は、カスタム・ステート・オブジェクトとカスタム注釈表現のために割り当てられている。

  • qpy.dump() そして qpy.load()annotation_factories を処理するコンストラクタ関数を提供するために使用される。 annotation.QPYSerializer オブジェクトのコンストラクタ関数を Annotation サブクラスを処理するためのオブジェクトのコンストラクタ関数を提供するために使用されます。 一般的に、 Qiskitは外部で定義可能なオブジェクトをすべて知ることはできないので、 metadata_serializer と同様に、 これらはユーザーが提供する必要があります。 Annotation オブジェクトを知ることができないからです。

  • に新しい関数 get_qpy_version() を追加した。 qpy モジュールを追加した。 この関数はQPYファイルを検査し、ペイロードで使用されているQPYフォーマットのバージョンを取得します。 バージョンは整数値で返され、ロギングやデバッグに使用できる。 14201号を参照のこと。

量子情報の特徴

  • 新しいクラスが追加されました、 PauliLindbladMapこれは、ノイズ学習アプリケーションで使われる、多量子ビット演算子の線形写像の部分集合のパウリに基づくパラメトリゼーションです。 このクラスは、強化されたノイズ学習アルゴリズムのバックボーンを形成し、Qiskitの将来のバージョンにおいて、ノイズモデルに対するより良い、より効率的な制御を提供することが期待されている。

  • を導入した。 QubitSparsePauliQubitSparsePauliList クラスが導入された。 PauliPauliList に類似した方法で、それぞれと同じ概念を表しますが、非同一項のみを格納します。 SparseObservable. これらのクラスは、主に新しい PauliLindbladMap.

合成機能

  • の新しい合成アルゴリズムを追加した。 HalfAdderGate と比較して、補助量子ビットを必要とせず、CXカウントも優れている。 adder_qft_d00():

  • クリーンなアンシレを利用するための新しい分解を追加。 MCXGate クリーンなアンシレを利用し、回路の深さと効率を改善:

    使用例:

    from qiskit.synthesis.multi_controlled import synth_mcx_1_clean_kg24
    
    n_ctrls = 10
    qc = synth_mcx_1_clean_kg24(n_ctrls)
    qc.draw()
  • マルチ制御 CZGate 合成ゲート数を削減するために改良され、場合によっては99%の削減が可能です。 を中心に改良された合成を活用することで達成された。 MCXGate 制御された CZGate 合成もまた

  • オブジェクトを合成するデフォルトのプラグインを改善した。 AnnotatedOperation オブジェクトを この改良は、制御されたゲートを持つ制御回路を作成し、トランスパイルする際に特に有効である。 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import CXGate
    from qiskit.compiler import transpile
    
    inner = QuantumCircuit(5)
    inner.append(CXGate().control(3, annotated=True), [0, 1, 2, 3, 4])
    controlled_inner_gate = inner.to_gate().control(2, annotated=True)
    qc = QuantumCircuit(15)
    qc.append(controlled_inner_gate, [0, 1, 2, 3, 4, 5, 6])
    qct = transpile(qc, basis_gates=["cx", "u"])

    このコードは、3制御のCXゲートを持つ2制御の量子回路を含む量子回路 qc 。 この改良により、トランスパイル回路のCXゲートの数は 378 から 30 に減少した。 制御ロジックを定義する際に annotated=True を指定することで、制御されるゲートが注釈付きオペレーションとして作成されることに注意してください。 これにより熱心な合成を避け、トランスパイラが controlled_inner_gate が6制御Xゲートと等価であることを検出し、特に利用可能なアンシラ量子ビットを利用して、マルチ制御Xゲートに利用可能な最良の合成方法を選択することができる。

  • 関数 adder_qft_d00()関数は ModularAdderGateHalfAdderGateannotated ゲートを合成するために使用される関数である。 True の場合、加算器内の逆QFTゲートは注釈付き演算として実装され、トランスパイラが追加の最適化を適用できるようになる。

  • 量子シャノン分解(qs_decomposition())には CXGate 入力ユニタリーが制御されたユニタリーである場合のカウントを減少させる最適化が含まれています。

  • 合成機能 synth_mcx_1_clean_b95() は、CXゲートの少ない回路を生成するようになった。

  • この SolovayKitaevDecomposition クラスのイニシャライザーに引数が追加され、 basis_gates のセットと、基本的な近似のための depth から直接構築できるようになりました。

  • 追加 SolovayKitaevDecomposition.save_basic_approximations() を追加し、クラスが使用する基本的な近似値のセットをバイナリ形式で保存するようにしました。 この変更と新しいイニシャライザー引数の組み合わせにより、ユーザーは明示的な generate_basic_approximations() を省略し SolovayKitaevDecomposition.

トランスパイラ機能

  • 関数 generate_preset_pass_manager() は、基底セットがClifford+Tゲートのみで構成されている場合、特別なパス・マネージャーを生成する。 形式的には、Clifford+T の基底セットは、Clifford ゲートのみと、以下のいずれかを含まなければならない。 TGate, TdgGateのいずれか、あるいは両方が含まれていなければならない。 サポートされているクリフォードゲートの全リストは、次のようにして得ることができる。 get_clifford_gate_names().

    例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.quantum_info import get_clifford_gate_names
    
    basis_gates = get_clifford_gate_names() + ["t", "tdg"]
    pm = generate_preset_pass_manager(basis_gates=basis_gates)
    
    qc = QuantumCircuit(1)
    qc.rx(0.8, 0)
    qct = pm.run(qc)
    print(qct.count_ops())

    という結果になるだろう:

    OrderedDict([('h', 10210), ('t', 4508), ('tdg', 4503), ('sdg', 943), ('s', 941)])

    以前は、生成されたパス・マネージャーは上の例を扱うことができなかった。 UGate 回転ゲートをClifford+Tゲートに分解することができなかったためです。 しかし、新しいパス・マネージャは、 HTTdg ゲートを用いて1量子ビット回転ゲートを近似するためにソロベイ・キタエフ分解を使用し、さらにゲートをターゲット基底セットに変換するためにトランスパイラ・パスを呼び出します。 BasisTranslator transpilerパスを呼び出し、ゲートをターゲット基底セットに変換します。 新しいパス・マネージャーは、より効率的にクリフォード+Tゲートに変換できるよう、他にも変更が加えられている。

    注意すべきは、指定されたClifford+T基底ゲートセットは普遍的であるべきで、そうでなければ移項は成功しないかもしれない。 ゲート集合 ["h", "t", "tdg"] 、あるいは ["h", "t"] 、普遍性を保つには十分であるが、可能であれば、さらにクリフォードゲートを追加することを推奨する。そうしないと、翻訳の効率が低下する可能性があるからだ。 たとえば、Sゲートが含まれていない場合、SゲートはTゲートのペアに分解されるかもしれない(つまり、クリフォード・ゲートは非クリフォード・ゲートに分解されるかもしれないが、これは望ましい動作ではないかもしれない)。

    以下は少し大きな例である:

    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import QFTGate
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    
    qc = QuantumCircuit(4)
    qc.append(QFTGate(4), [0, 1, 2, 3])
    
    basis_gates = ["cx", "s", "sdg", "h", "t", "tdg"]
    pm = generate_preset_pass_manager(basis_gates=basis_gates, optimization_level=2)
    
    qc = QuantumCircuit(4)
    qc.append(QFTGate(4), [0, 1, 2, 3])
    
    qct = pm.run(qc)
    print(qct.count_ops())

    という結果になるだろう:

    OrderedDict([('h', 96510), ('tdg', 42396), ('t', 42389), ('s', 8240), ('sdg', 8235), ('cx', 12)])
  • ハイレベル合成プラグインの追加 HalfAdderSynthesisR25 を合成する HalfAdderGate. 新しいプラグインは adder_ripple_r25().

    また HalfAdderSynthesisDefault"HalfAdder.ripple_r25" 3\leq 3、1つの補助量子ビットが利用可能な場合は、それ以外の場合は。 "HalfAdder.ripple_c04" "HalfAdder.ripple_r25"

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

    この MCXSynthesisDefault クラスも更新され、最初のメソッドが成功するまで、次の一連のMCX合成メソッドを実行するようになりました: "mcx.2_clean_kg24" "mcx.1_clean_kg24", "mcx.n_clean_m15", "mcx.n_dirty_i15"`, ``"mcx.2_dirty_kg24", "mcx.1_dirty_kg24", "mcx.1_clean_b95", "mcx.noaux_v24".メソッドは、より質の高いものが最初に適用されるように順序付けされている。

  • VF2PostLayout 最適化レベル3を使用する場合、デフォルトの最適化段階の最後に追加されている。

  • 新しい OptimizeCliffordT 連続するTゲートのペアをSゲートに、連続するTdgゲートのペアをSdgゲートにマージするトランスパイラ最適化パスを追加。 この最適化は、複数の連続したTまたはTdgゲートを生成するソロベイ・キタエフ分解後のTカウントを減らすのに特に効果的である。 例:

    from qiskit.circuit import QuantumCircuit
    from qiskit.transpiler.passes import SolovayKitaev, OptimizeCliffordT
    
    qc = QuantumCircuit(1)
    qc.rx(0.8, 0)
    
    # Run Solovay-Kitaev pass on qc
    transpiled = SolovayKitaev()(qc)
    print(transpiled.count_ops().get("t", 0) + transpiled.count_ops().get("tdg", 0))
    # Should print 12779
    
    # Run Clifford+T optimization
    optimized = OptimizeCliffordT()(transpiled)
    print(optimized.count_ops().get("t", 0) + optimized.count_ops().get("tdg", 0))
    # Should print 9011
  • を追加した。 ContextAwareDynamicalDecoupling パスが追加され、ウォルシュ・ハダマード数列に基づくコンテキストを考慮した動的デカップリングが実装された。 挿入される遅延シーケンスは、隣接する量子ビットのシーケンスと相互に直交し、CXゲートとECRゲートの制御/ターゲットスペクタを考慮する。 参照 arXiv:2403.06852 を参照のこと。

    例:

    from qiskit.circuit.library import QFT
    from qiskit.transpiler import PassManager, CouplingMap
    from qiskit.transpiler.passes import ALAPScheduleAnalysis, ContextAwareDynamicalDecoupling
    from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
    from qiskit.providers.fake_provider import GenericBackendV2
    
    num_qubits = 10
    circuit = QFT(num_qubits)
    circuit.measure_all()
    
    target = GenericBackendV2(
        100,
        basis_gates=["id", "rz", "sx", "x", "ecr"],
        coupling_map=CouplingMap.from_grid(10, 10)
    ).target
    
    pm = generate_preset_pass_manager(optimization_level=2, target=target)
    dd = PassManager([
        ALAPScheduleAnalysis(target=target),
        ContextAwareDynamicalDecoupling(target=target),
    ])
    
    transpiled = pm.run(circuit)
    with_dd = dd.run(transpiled)
    
    with_dd.draw("mpl", idle_wires=False)
    _images/release_notes-2.png
  • 以下の属性を DAGCircuit クラスを追加しました: num_stretches, num_captured_stretches および num_declared_stretches.

  • 新しいユニタリー合成プラグイン CliffordUnitarySynthesis このプラグインは、与えられたユニタリー・ゲートがクリフォードで表現できるかどうかをチェックすることによって合成を試み、その場合、このユニタリーを実装し、クリフォード・ゲートだけで構成される回路を返す。

    このプラグインは UnitarySynthesismethod "clifford"トランスパイラパスによって呼び出されます。

    さらに、 plugin_config UnitarySynthesis のパラメータは、以下のプラグイン固有のパラメータを渡すために使うことができる:

    • min_qubits: 考慮する量子ビットの最小数(デフォルト値は1)。
    • max_qubits: 考慮する量子ビットの最大数(デフォルト値は3)。

    例:

    import math
    
    from qiskit.circuit import QuantumCircuit
    from qiskit.circuit.library import UnitaryGate
    from qiskit.quantum_info import Operator
    from qiskit.transpiler.passes import UnitarySynthesis
    
    # clifford unitary over 2 qubits
    c2 = QuantumCircuit(2)
    c2.h(0)
    c2.rz(math.pi / 4, 1)
    c2.rz(math.pi / 4, 1)
    c2.sdg(1)
    uc2 = UnitaryGate(Operator(c2).data)
    
    # non-clifford unitary over 2 qubits
    n2 = QuantumCircuit(2)
    n2.h(0)
    n2.rz(math.pi / 4, 1)
    n2.sdg(1)
    un2 = UnitaryGate(Operator(n2).data)
    
    # quantum circuit with two unitary gates
    qc = QuantumCircuit(3)
    qc.append(uc2, [2, 1])
    qc.append(un2, [0, 2])
    
    transpiled = UnitarySynthesis(method="clifford")(qc)
    transpiled.draw("mpl")
    _images/release_notes-3.png

    上記のコードを実行すると、最初のユニタリー・ゲートはクリフォード・ゲートに再合成されるが、2番目のゲートは変更されない。

    上の例を次のように修正すると

    config = {"min_qubits": 3}
    transpiled = UnitarySynthesis(method="clifford", plugin_config=config)(qc)

    その場合、両方のユニタリーゲートは変更されない。

可視化機能

  • のカスタムスタイルを導入。 dag_drawer() 関数にカスタムスタイルを導入しました。 これにより、関数が返すDAGのスタイルを変更するカスタム属性を持つディクショナリを style パラメータに渡すことができます。 例:

    from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit
    from qiskit.converters import circuit_to_dag
    from qiskit.visualization import dag_drawer
    
    q = QuantumRegister(3, 'q')
    c = ClassicalRegister(3, 'c')
    circ = QuantumCircuit(q, c)
    circ.h(q[0])
    circ.cx(q[0], q[1])
    circ.measure(q[0], c[0])
    circ.rz(0.5, q[1]).c_if(c, 2)
    
    dag = circuit_to_dag(circ)
    
    style = {
        "inputnodecolor": "pink",
        "outputnodecolor": "lightblue",
        "opnodecolor": "red",
    }
    
    dag_drawer(dag, style=style)

アップグレードの注意

  • python-dateutil ライブラリはもはや Qiskit の依存関係ではありません。 Qiskit v2.0 以降、ライブラリの何も python-dateutil を使っておらず、Qiskit はもうライブラリに依存していない。 このリリースでは依存関係リストからこれを削除し、Qiskitを使用するための前提条件として自動的にインストールされないようにしています。 Qiskitが依存関係としてdateutilをインストールしてくれるのを頼りにしていた場合、手動でインストールする必要があります(これは直接依存する場合のベストプラクティスです)。

  • sympy はQiskitのインストール要件ではなくなりました。 クラス用のRustベースのシンボリック・エンジンへの移行後、 の使用は一部の視覚化ユーティリティに限定された。 ParameterExpression クラスのためのRustベースのシンボリックエンジンへの移行後、 SymPy の使用は、いくつかの可視化ユーティリティと TemplateOptimization トランスパイラ・パス ParameterExpression.sympify() (これは、 SymPy 相互運用性のためです)と SparsePauliOp.simplify() パラメータ化された係数を使用する場合 この機能は最も一般的に使用されるものではないため、 SymPy はオプションの依存関係として扱われ、これらの関数が使用され、 がインストールされていない場合は例外が発生します。 MissingOptionalLibraryErrorSymPy 例外が発生します。

  • オブジェクトの構築に使用されていた symengine への依存は削除された。 ParameterExpression オブジェクトの構築に使用されていた 内部シンボルエンジンに取って代わられ、Qiskitの中核機能にはもはや必要ありません。 唯一の例外は、symengineがQPYフォーマット10、11、12に組み込まれていることで、これらのフォーマットをデシリアライズする場合はまだ必要です。 の symengine への依存は、 で明示的にオプションになりました。 qpy.load() への依存は、 2.0.0 で明示的にオプショナルになりましたが、この機能のためにデフォルトでインストールされる symengine に依存していた場合は、ペイロードをロードするために手動でインストールする必要があります。 もし ParameterExpression.sympify() からsymengine式オブジェクトを取得するために ParameterExpression からsymengine式オブジェクトを取得していた場合は、 sympy 式を返すようになります。 これをsymengineで使う必要がある場合は、 symengine.sympify を利用して、 sympy 式をsymengine式に変換することができる。

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

  • definition 属性が変更された。 HalfAdderGate の属性は内部的に adder_ripple_r25() に変更され、補助量子ビットのないより効率的な回路のゲートの定義が生成されるようになりました。 何らかの理由で古い定義が必要な場合は、代わりに adder_qft_d00() 関数を直接使うことができる。 definition と同等の回路が生成されます。

  • が返す回路は excitation_preserving() 関数と ExcitationPreserving クラスが返す回路は XXPlusYYGate. これは、以前のリリースでは RXXGate の後に RYYGate. この新しい回路構成は同等だが、より単純な定義により、すべての励磁を保持するゲートの数が少ない。

  • その definition いくつかの標準ゲートの属性は、以下の原則に従って更新されている:

    • 利用可能な場合は、非クリフォード・ゲートを含む定義よりも、クリフォード・ゲートを使用した定義が優先される。
    • 利用可能な場合、クリフォード+Tゲートを使用する定義の方が、.Tゲートを使用する定義よりも好ましい。 UGate.
    • の使用が望ましい。 PhaseGateU1Gate.
    • の使用が望ましい。 UGate の使用は、 `U2Gate`U3Gate よりも好ましい。

    ゲート定義を再帰的に展開することで、どのゲートも最終的には ["cx", "u"] の基底のみを用いて表現することができる。 すべての標準的なゲートの定義はすべて等価であるため、ゲートの背後にあるセマンティクスは変わらないが、いくつかのゲートに対して返される正確な回路構成がまったく同じではなくなっているだけだ。 この変更は、クリフォード+T移調をサポートするために必要だった。

  • の内部を実装するために、Qiskitは独自のRustベースの記号式ライブラリを使用するようになりました。 ParameterExpressionParameter. のコアとなる記号数学エンジンの新しい実装であるため、いくつかの機能の正確な動作には若干の違いがあるかもしれません。 ParameterExpression のコアとなる記号計算エンジンの新しい実装であるため、いくつかの機能の正確な動作に若干の違いがあるかもしれない。 ドキュメント化されたAPIでは、常に同等の結果が得られるはずだ。 正しさに問題がある場合は、issueを開いてください。

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

  • QiskitのC APIにおける複素数の公開方法が変更されました。 以前は、 QkComplex64 はコンパイラ依存の型定義で、ネイティブの複合型を Qiskit の API にポインタで渡すことができた(たとえば、 double complex* )。 これは便利ではあったが、このアプローチは、厳密には保証されていないメモリレイアウトの仮定に暗黙のうちに依存していた。

    Qiskit v2.1 は、 QkComplex64 { double re; double im; } を構造体として公開するようになりました。これは、 メモリレイアウトが常に互換性を持つようにするためと、 より広範なコンパイラサポートのためです。 便宜上、構造体からネイティブ複素数への変換を可能にするコンパイラ依存のコンバータ qk_complex64_from_nativeqk_complex64_to_native が提供されている。 これらは、 double complex をサポートするプラットフォーム、または _Dcomplex を使用する MSVC コンパイラでのみ動作することに注意してください。

    例:

    #include <qiskit.h>
    #include <math.h>
    #include <stdio.h>
    #include <complex.h>
    
    int main(int argc, char *argv[]) {
        // platform-independent constructions:
        QkComplex64 coeff = {5.0, 3.0};
    
        // ... or using converter
        // double complex native = 5.0 + I * 3; // uses C11 standard, does not work on MSVC
        // QkComplex64 coeff = qk_complex64_from_native(&native);  // convert from native
    
        uint32_t num_qubits = 100;
        QkObs *obs = qk_obs_zero(num_qubits);
        QkBitTerm bit_terms[3] = {QkBitTerm_X, QkBitTerm_Y, QkBitTerm_Z};
        uint32_t indices[3] = {0, 1, 2};
        QkObsTerm term = {coeff, 3, bit_terms, indices, num_qubits};
        qk_obs_add_term(obs, &term);
        printf("num_qubits: %u\n", qk_obs_num_qubits(obs));
        printf("num_terms: %lu\n", qk_obs_num_terms(obs));
    
        qk_obs_free(obs);
        return 0;
    }

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

  • が発するデフォルトのQPYバージョンは、最新のQPYバージョン15に変更された。 qpy.dump() は最新のQPYバージョン15に変更されました。 何らかの理由で古いフォーマットのバージョンを生成する必要がある場合は、 version のキーワード引数を使用します。 qpy.dump() を指定することができます。

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

  • Solovay-Kitaevアルゴリズムの基本近似のシリアライズ形式が、 .npy から、Rustの serdebincode に基づく別のバイナリ形式に変更されました。 基本的な近似値( generate_basic_approximations(), SolovayKitaevDecomposition.load_basic_approximations()SolovayKitaevなど)をロードするすべてのルーチンは、依然としてレガシー形式のロードをサポートしています。 しかし、新しいファイルはすべて新しいフォーマットで保存される。 2.2 旧形式に依存している場合は、Qiskitをダウングレードして、必要なファイルを保存してください。

  • のデフォルト値は SolovayKitaev (および関連クラス)のデフォルト値は depth=12reps=5 に増加した。 これは基本的な実装がRustになったためで、デフォルトの精度を上げることができ、なおかつ以前の Python。

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

  • 現在のパスマネージャー用の組み込みレイアウトプラグインは、カップリング制約が提供されない場合、その主要コンポーネント(例えば、"sabre "ステージ用の SabreLayout 例えば、 "sabre "ステージのインスタンス)が含まれなくなります。 以前は、別のロジックがパスの実行や例外の発生を防ぐという前提で、プラグインはレイアウトパスの無効なインスタンスを構築していました。

    無効な状態でパスを呼び出すことは決して有効ではなかったからだ。

非推奨のメモ

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

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

回路の廃止予定

バグ修正

  • のバグを修正しました。 dag_drawer() 関数と DAGCircuit.draw() メソッドで、キーワード引数 style=plain を設定しても DAG のノードの回路ラベルが可視化されない不具合を修正しました。

  • メソッドのバグを修正。 QuantumCircuit.assign_parameters() メソッドにおいて、引数 strict=False が設定されたときに、回路で使用されず文字列として渡されたパラメータが無視されないというバグを修正した。 詳細は issue #13933 を参照してください。

  • Windows 用 Makefile の設定において、事前に定義された環境変数 OSuname -s コマンドの出力と一致しないエッジケースを修正。

  • を修正した。 name 属性を修正しました。 OrGateの属性が、期待される値 "or" ではなく、文字列 "and" に誤って設定されていたのを修正しました。 この不正確な値 "and"AndGate.name と衝突し、 Orgate の使用と AndGate.

  • 関数のバグを修正。 qpy.load() 関数で、パラメータが同じ名前のパラメータに再割り当てされた回路のデシリアライズに失敗することがあるバグを修正しました。 13720, #13720, #13720を修正。

  • を修正しました。 GenericBackendV2 を修正しました。 BoxOp 生成される GenericBackendV2.targetcontrol_flow=True に含まれるように修正した。

  • を合成する場合 MCXGate ゲートを合成する場合、合成機能 synth_mcx_n_dirty_i15() は1つの補助量子ビットを必要とし、5つの量子ビット(3つの制御、1つのターゲット、1つの補助)を持つ回路を生成していました。 しかし、実際の合成アルゴリズムでは、この補助量子ビットは利用されない。 この動作は修正された。合成される回路は4量子ビット以上(3つのコントロールと1つのターゲット)であるため、合成機能を適用できるケースがわずかに増えた。

  • その QuantumCircuit.draw()circuit_drawer() 関数は BoxOp の命令をレンダリングするようになりました。 QuantumCircuit の命令は、垂直スパンが重ならない場合は、可能な限り同じ垂直スライスでレンダリングされるようになりました。

  • を修正した。 QuantumCircuit.draw() メソッドと circuit_drawer() メソッドと関数を修正した( "mpl" モード)。 BoxOp インスタンスを QuantumCircuit.

その他の注意事項

  • 新しいオプションの追加依存ターゲット qpy-compat。 このターゲットは、古いQPYフォーマットを使って qpy ファイルをロードするつもりなら、このターゲットを使うべきである。 pip install qiskit[qpy-compat]このターゲットは、フォーマットバージョン < 13. If you are only using newer QPY format versions you do no need to install this. The qpy.dump() only generates QPY > =13 を使用して QPY ファイルをロードするために使用される追加要件をインストールします。これは、古い ( 2.0.0 より古い) Qiskit リリースで生成されたファイルをロードするためにのみ必要です。

  • の "基本 "成分と "先読み "成分の相対的なウェイトを示す。 SabreSwapSabreLayout の相対的な重みが変更された。 SabreLayoutデフォルトでは SabreSwap). この動作は歴史的な選択であったが、回路規模が大きくなると、フロントレイヤーがほとんど無視されるという偶発的な効果をもたらし、効率にとって悲惨なことになる。

    その結果、配線が改善されるのは、20以上の並列2量子ビットゲートのレイヤーに頻繁に階層化できる回路で顕著になるはずだ。

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