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_name、parametersの引数が既存の命令と一致するメソッドが呼び出された場合、命令の量子ビット順序のチェックがスキップされるというバグを修正しました。 -
psの単位を使用した遅延命令のある回路を QASM3 にエクスポートする際の正しさのバグを修正。 -
回路表示のエッジケースを修正。
QFT回路の表示のエッジケースを修正しました。 以前はQFT.inverse()が呼び出され、QFT回路の属性が変更されると、QFTの名前は"IQFT_dg"と表示されていました。 これは誤りであり、現在は"IQFT"を正しく表示している。 修正 #14758。 -
qk_circuit_get_instructionとqk_circuit_instruction_clearを使用する際のメモリリークを修正。 -
で指定されたバージョンが無効であった場合のエラーメッセージを明確化した。
qpy.dump()のエラーメッセージを明確にした。 -
を修正しました。
generate_preset_pass_manager()関数の問題を修正しました。Targetbackendオブジェクトに含まれるタイミング制約データを誤って無視する問題を修正しました。 修正 #14329 -
のバグを修正した。
SparsePauliOp.simplify()メソッドが重複を結合する前に係数の大きさに基づいてパウリ項を削除していたバグを修正。 このため、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、境界のない検索が実行され、負の数を使用するとエラーが発生するようになった。 これらの見落としは修正され、パスはドキュメント通りに動作し、以前のリリースと一貫性が保たれるようになった。 -
高位合成プラグインの問題を修正
MCXSynthesis1DirtyKG24とMCXSynthesis2DirtyKG24のMCXGateプラグインが利用可能なクリーン補助量子ビットを利用可能なダーティ補助量子ビットとみなしていなかった問題を修正しました。 特に、プラグイン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')
-
新しい
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またはPauliをfloatの値にマッピングする。 ただしSparseObservableがプロジェクターを含んでいる場合、その処理のサポートはプリミティブの実装に依存する。 このリリースでは、Qiskit (StatevectorEstimatorおよびBackendEstimatorV2)、qiskit-ibm-runtime(qiskit_ibm_runtime.EstimatorV2)、およびQiskit Aerの(qiskit_aer.primitives.EstimatorV2)のプリミティブ実装はまだ射影観測値をサポートしていません。 投影観測量とは、用語を含む観測量である:01,+,-,r, またはl. -
クラスをシリアライズ可能にするために
DataBinクラスをサポートしてpickle. これによってPrimitiveJobとPrimitiveResultクラスをpickleでシリアライズ可能になる。
OpenQASM 特徴
-
qasm3.dump()そしてqasm3.dumps()annotation_handlersのインスタンスを提供するために使われる。annotation.OpenQASM3Serializerのインスタンスを OpenQASM 3 エクスポート・プロセスに提供するために使用されます。Annotationオブジェクトを OpenQASM 3 にシリアライズすることができる。 -
qiskit_qasm3_import>=0.6.0、qasm3.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の将来のバージョンにおいて、ノイズモデルに対するより良い、より効率的な制御を提供することが期待されている。 -
を導入した。
QubitSparsePauliとQubitSparsePauliListクラスが導入された。PauliとPauliListに類似した方法で、それぞれと同じ概念を表しますが、非同一項のみを格納します。SparseObservable. これらのクラスは、主に新しいPauliLindbladMap.
合成機能
-
の新しい合成アルゴリズムを追加した。
HalfAdderGateと比較して、補助量子ビットを必要とせず、CXカウントも優れている。adder_qft_d00(): -
クリーンなアンシレを利用するための新しい分解を追加。
MCXGateクリーンなアンシレを利用し、回路の深さと効率を改善:synth_mcx_1_clean_kg24()アンシラ量子ビットを1個追加するsynth_mcx_1_dirty_kg24()ダーティなアンシラ量子ビットを1個追加するsynth_mcx_2_clean_kg24()さらに2つのクリーンな補助量子ビットを使用するsynth_mcx_2_dirty_kg24()さらに2つのダーティな補助量子ビットを使用する
使用例:
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()関数はModularAdderGateとHalfAdderGateannotatedゲートを合成するために使用される関数である。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ゲートに分解することができなかったためです。 しかし、新しいパス・マネージャは、H、T、Tdgゲートを用いて1量子ビット回転ゲートを近似するためにソロベイ・キタエフ分解を使用し、さらにゲートをターゲット基底セットに変換するためにトランスパイラ・パスを呼び出します。BasisTranslatortranspilerパスを呼び出し、ゲートをターゲット基底セットに変換します。 新しいパス・マネージャーは、より効率的にクリフォード+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"、1つの補助量子ビットが利用可能な場合は、それ以外の場合は。"HalfAdder.ripple_c04""HalfAdder.ripple_r25" -
を合成するための複数のハイレベル合成プラグインを追加した。
MCXGate:MCXSynthesis1CleanKG24に基づいている。synth_mcx_1_clean_kg24().MCXSynthesis1DirtyKG24に基づいている。synth_mcx_1_dirty_kg24().MCXSynthesis2CleanKG24に基づいている。synth_mcx_2_clean_kg24().MCXSynthesis2DirtyKG24に基づいている。synth_mcx_2_dirty_kg24().
この
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)
-
以下の属性を
DAGCircuitクラスを追加しました:num_stretches,num_captured_stretchesおよびnum_declared_stretches. -
新しいユニタリー合成プラグイン
CliffordUnitarySynthesisこのプラグインは、与えられたユニタリー・ゲートがクリフォードで表現できるかどうかをチェックすることによって合成を試み、その場合、このユニタリーを実装し、クリフォード・ゲートだけで構成される回路を返す。このプラグインは
UnitarySynthesismethod"clifford"トランスパイラパスによって呼び出されます。さらに、
plugin_configUnitarySynthesisのパラメータは、以下のプラグイン固有のパラメータを渡すために使うことができる:- 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")
上記のコードを実行すると、最初のユニタリー・ゲートはクリフォード・ゲートに再合成されるが、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. - の使用が望ましい。
PhaseGateはU1Gate. - の使用が望ましい。
UGateの使用は、`U2Gateや`U3Gateよりも好ましい。
ゲート定義を再帰的に展開することで、どのゲートも最終的には
["cx", "u"]の基底のみを用いて表現することができる。 すべての標準的なゲートの定義はすべて等価であるため、ゲートの背後にあるセマンティクスは変わらないが、いくつかのゲートに対して返される正確な回路構成がまったく同じではなくなっているだけだ。 この変更は、クリフォード+T移調をサポートするために必要だった。 -
の内部を実装するために、Qiskitは独自のRustベースの記号式ライブラリを使用するようになりました。
ParameterExpressionとParameter. のコアとなる記号数学エンジンの新しい実装であるため、いくつかの機能の正確な動作には若干の違いがあるかもしれません。ParameterExpressionのコアとなる記号計算エンジンの新しい実装であるため、いくつかの機能の正確な動作に若干の違いがあるかもしれない。 ドキュメント化されたAPIでは、常に同等の結果が得られるはずだ。 正しさに問題がある場合は、issueを開いてください。
C API アップグレードに関する注意事項
-
QiskitのC APIにおける複素数の公開方法が変更されました。 以前は、
QkComplex64はコンパイラ依存の型定義で、ネイティブの複合型を Qiskit の API にポインタで渡すことができた(たとえば、double complex*)。 これは便利ではあったが、このアプローチは、厳密には保証されていないメモリレイアウトの仮定に暗黙のうちに依存していた。Qiskit v2.1 は、
QkComplex64 { double re; double im; }を構造体として公開するようになりました。これは、 メモリレイアウトが常に互換性を持つようにするためと、 より広範なコンパイラサポートのためです。 便宜上、構造体からネイティブ複素数への変換を可能にするコンパイラ依存のコンバータqk_complex64_from_nativeとqk_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のserdeとbincodeに基づく別のバイナリ形式に変更されました。 基本的な近似値(generate_basic_approximations(),SolovayKitaevDecomposition.load_basic_approximations()やSolovayKitaevなど)をロードするすべてのルーチンは、依然としてレガシー形式のロードをサポートしています。 しかし、新しいファイルはすべて新しいフォーマットで保存される。 2.2 旧形式に依存している場合は、Qiskitをダウングレードして、必要なファイルを保存してください。 -
のデフォルト値は
SolovayKitaev(および関連クラス)のデフォルト値はdepth=12とreps=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 以上にアップグレードする必要があります。
回路の廃止予定
-
回路ライブラリはQiskit v1.3 リリースでリファクタリングが行われました。
QuantumCircuit型のオブジェクトの代替が提供されました。Instructionまたは Python 関数で構成されます。 このリファクタリングにより、コンパイラは高水準命令を推論できるようになり、高水準の最適化を必要としない回路のオーバーヘッドが削減される。すべての
QuantumCircuitすべてのサブクラスは非推奨となり、Qiskit v1.3 で導入された代替クラスが使用されます。 その一環として、BlueprintCircuitの基本クラスも非推奨となる。 いずれも非推奨期間が延長され、Qiskit v3.0 でのみ削除されます。BlueprintCircuitクラスは直接置き換えることができません。QuantumCircuitを直接使うか、回路を生成する関数を使う。 詳細はqiskit.circuit.libraryを参照してほしいが、一般的な回路とその代替品を以下に示す:QFT→QFTGateTwoLocal→n_local()(をカバーしています。NLocalとTwoLocal機能をカバーしている)EfficientSU2→efficient_su2()RealAmplitudes→real_amplitudes()ZZFeatureMap→zz_feature_map()QuantumVolume→quantum_volume()EvolvedOperatorAnsatz→evolved_operator_ansatz()MCXGrayCode→synth_mcx_gray_code()MCXRecursive→synth_mcx_n_dirty_i15()MCXVChain→synth_mcx_n_clean_m15()
バグ修正
-
のバグを修正しました。
dag_drawer()関数とDAGCircuit.draw()メソッドで、キーワード引数style=plainを設定しても DAG のノードの回路ラベルが可視化されない不具合を修正しました。 -
メソッドのバグを修正。
QuantumCircuit.assign_parameters()メソッドにおいて、引数strict=Falseが設定されたときに、回路で使用されず文字列として渡されたパラメータが無視されないというバグを修正した。 詳細は issue #13933 を参照してください。 -
Windows 用
Makefileの設定において、事前に定義された環境変数OSがuname -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. Theqpy.dump()only generates QPY > =13 を使用して QPY ファイルをロードするために使用される追加要件をインストールします。これは、古い ( 2.0.0 より古い) Qiskit リリースで生成されたファイルをロードするためにのみ必要です。 -
の "基本 "成分と "先読み "成分の相対的なウェイトを示す。
SabreSwapとSabreLayoutの相対的な重みが変更された。SabreLayoutデフォルトではSabreSwap). この動作は歴史的な選択であったが、回路規模が大きくなると、フロントレイヤーがほとんど無視されるという偶発的な効果をもたらし、効率にとって悲惨なことになる。その結果、配線が改善されるのは、20以上の並列2量子ビットゲートのレイヤーに頻繁に階層化できる回路で顕著になるはずだ。