Qiskit SDK 2.3 リリースノート
2.3.1
前奏曲
Qiskit v2.3.1 は、Qiskit v2.3.0 のリリース以降に発見されたいくつかのバグを修正しています。
バグ修正
-
の組み込み
permutation.kms合成プラグインは、qiskit.synthesis長さ0の順列を正しく処理するようになりました。 #15550 を修正しました。 -
単一量子ビットのクリフォード演算
synth_clifford_depth_lnn()について。 #15780を参照してください。 -
演算を再帰的に合成した後、量子ビットの状態が正しく更新されないという、
HighLevelSynthesisトランスパイラ・パスのバグを修正しました。 場合によっては、これによりパスによって誤った回路が生成される可能性があります。 -
関数
qs_decomposition()内の問題を修正しました。これにより、内部の線形代数ルーチンにおける許容誤差の問題が発生した場合にパニックが発生し、プログラムがクラッシュする現象が解消されました。 この問題は修正されたため、このような状況では、代わりに適切なQiskitError例外またはそのサブクラスがスローされるようになりました。#15610 を修正しました。
-
2つ以上の量子ビットを含むゲートに対して、アクセス時
UnitaryGate.definitionUnitaryGate.control()および呼び出し時のUnitaryGateデフォルトの合成は、内部的に 関数qs_decomposition()に依存します。 反復的な量子シャノン分解に伴う線形代数ルーチンでは、浮動小数点演算の許容誤差の影響により、計算が常に成功するとは限らない場合があります。 これらの属性やメソッドが失敗するのを防ぐため、このような状況では、代わりにからの分解Isometryが用いられる。 これにより、効率の悪い分解になってしまうものの、qs_decomposition()が失敗qs_decomposition()した際の代替手段として機能します。 -
非対称演算(** や - など)において
ParameterExpression.sympify()、特定の,ParameterやParameterExpression、および数値の組み合わせによってオペランドが逆転してしまうバグを修正しました。 #15642を参照してください。 -
「identity observable」項にアクセスする際の
qk_obs_term()不具合を修正しました。 #15536を参照してください。 -
浮動小数点ノイズの影響により、対称的なもつれ状態(ベル状態など)が任意に回転してしまう
plot_state_qsphere()という可視化上の不具合を修正しました。 -
パラメータ化されたゲートを持つ回路について
QuantumCircuit.repeat()修正しました。#15645を参照してください。
-
「ancilla」という名前のユーザー作成レジスタが存在する場合、
QuantumCircuit.ensure_physical()を使用して作成された回路でクラッシュqpy.load()するバグを修正しました。 -
特定のトランスパイラ処理段階で、
ContinueLoopOpが誤って制御フロー操作と見なされる問題をBreakLoopOp修正しました。これにより、が発生AttributeErrorする可能性がありました。 #15579 を参照してください。 -
「ancilla」という名前のユーザー作成レジスタが存在する場合、
SabreLayoutを使用して作成された回路でクラッシュqpy.load()するバグを修正しました。 -
NumPy の最小必要バージョンが、 1.17 ではなく 1.21 として正しく記載されるようになりました。 NumPy で導入された
1.21の使用によりnumpy.typing.NDArray、この制限は数回のリリースにわたり事実上適用されてきたため、古いバージョンのNumPyでは Qiskit のインポートに失敗します。 -
OpenQASM 3 のエクスポート機能(
qasm3.dumps()およびdump())は、識別子内で使用される場合、ASCII 数字以外の Unicode「数字」文字を正しくエスケープするようになりました。 以前は、上付き文字などの文字が出力に残っていましたが、これは OpenQASM 3の仕様には準拠していません。 -
OpenQASM 3のエクスポート機能(
qasm3.dumps()およびdump())は、名前がASCII数字で始まる識別子を正しくエスケープするようになりました。 -
引
dtype数が指定されていない場合、メソッドSparsePauliOp.from_list()および は、係数のデータ型SparsePauliOp.from_sparse_list()を自動的に推論するようになりました。例:
from qiskit.quantum_info import SparsePauliOp from qiskit.circuit import Parameter theta = Parameter("theta") # Previously required manually setting dtype=object op_list = SparsePauliOp.from_list([("X", theta)]) op_sparse = SparsePauliOp.from_sparse_list([("X", [0], theta)], num_qubits=1)
2.3.0
前奏曲
Qiskit v2.3.0 は、 Qiskit SDK の新機能リリースです。
この新バージョンでは、トランスパイル用の C API が大幅に拡張され、C から (QkTarget) Target の詳細を確認できるようになり、(QkDag) DAGCircuit の作成や操作が可能になりました。 これにより、スタンドアロン libqiskit ・オブジェクトに対してコンパイルする際に、カスタム・トランスパイラ・パスを記述できるようになります。 C API には、個々のトランスパイル段階の関数(例: qk_transpile_stage_layout())が用意されており、パイプライン全体を手動で再構築することなく、トランスパイルにカスタムロジックを簡単に組み込むことができます。
初期のフォールトトレラントなターゲットへのトランスパイルのパフォーマンスと機能セットも改善されました。 この新しい PauliProductMeasurement 命令は、パウリ積基底への射影変換を表すものであり、Qiskitは既存の LitinskiTransformation パスを使用して、回路をパウリ基底に基づく計算形式へトランスパイルすることを完全にサポートするようになりました。 トランパイラで設定可能な新しい単一合成法により、 RossSelingerSynthesis単一量子ビットのクリフォード+T合成に対して、漸近的に最適な unitary_synthesis_method="gridsynth"ロス・セリンガーアルゴリズムを使用できるようになる。 その他の改良点としては、例えば、パウルイ基底回路の可換性最適化を考慮した、より優れた OptimizeCliffordT パスや、その CommutativeOptimization パスなどが挙げられる。
内部的には、オブジェクト ControlFlowOp の表現がRustネイティブのものに変更されました。 この変更はまだ完了していません。Qiskit 2.3 では、制御フロー操作の周辺でパフォーマンスの低下が見られる可能性があります。 Qiskitの今後のバージョンでは、この取り組みをさらに進め、制御フロー演算に関する長年の課題であったパフォーマンスやAPIの問題を解決する予定です。
本リリース以降、 Python 3.9 は2025年10月にサポート終了となるため、サポート対象外となります。また、 macOS のIntelプロセッサ向けサポートは、Appleによるプラットフォームの段階的廃止開始に伴い、ティア2プラットフォームサポートに格下げされました。 3.10 以降のすべてのバージョンのCPythonがサポートされています。 各プラットフォームの現在のサポートレベルについては、 オペレーティングシステムのサポートを参照してください。
Qiskitの 2.x シリーズでは、今後さらに機能リリースが行われる予定です。Qiskit 3.0 のリリースは、2026年のかなり後になる見込みです。現時点では互換性を損なう変更の必要性がないためです。
C API の機能
-
任意のゲートまたは命令とインスタンスとの互換性を確認
QkTargetするqk_target_instruction_supported()機能を追加しました。 このチェックは、指定されたコマンドの名前、qargs、およびパラメータに基づいて実行されます。 -
既存のターゲットエントリの名前を設定する
qk_target_entry_set_name()機能を追加しました。 -
量子ボリュームモデル回路を生成する新
qk_circuit_library_quantum_volume()機能を追加しました。 -
.
QkTargetのゲートマップを反復処理および検証する方法を追加しました。 以下のメソッドが追加されました:qk_target_op_num_properties()qk_target_op_index()qk_target_op_name()qk_target_op_qargs_index()qk_target_op_qargs()qk_target_op_props()
そして以下の表現が追加された:
例:
// Create Target with a mix of global and non-global gates. QkTarget *target = qk_target_new(2); // Create a CX entry QkTargetEntry *cx_entry = qk_target_entry_new(QkGate_CX); uint32_t qarg_samples[2][2] = { {0, 1}, {1, 0}, }; double props[2][2] = { {2.7022e-11, 0.00713}, {3.0577e-11, 0.00713} }; for (int i = 0; i < 2; i++) { qk_target_entry_add_property(cx_entry, qarg_samples[i], 2, props[i][0], props[i][1]); } qk_target_add_instruction(target, cx_entry); // Create an SX entry QkTargetEntry *sx_entry = qk_target_entry_new(QkGate_SX); for (int i = 0; i < 2; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(sx_entry, qargs, 1, 35.5e-9, 0.); } qk_target_add_instruction(target, sx_entry); // Create an H entry qk_target_add_instruction(target, qk_target_entry_new(QkGate_H)); // Get the size of the size_t target_length = qk_target_num_instructions(target); for (size_t op_idx = 0; op_idx < target_length; op_idx++) { // Allocate space for qargs and props uint32_t *qargs; uint32_t qargs_len; QkInstructionProperties props; // Retrieve the operation's name char *name = qk_target_op_name(target, op_idx); size_t num_props = qk_target_op_num_properties(target, op_idx); for (size_t props_idx = 0; props_idx < num_props; props_idx++) { // Populate qargs qk_target_op_qargs(target, op_idx, props_idx, &qargs, &qargs_len); // Populate properties qk_target_op_props(target, op_idx, props_idx, &props); } // Free the name string qk_str_free(name); } -
QkTarget現在、ユーザーが直接そこから操作を取得できる機能を提供しています。 以下のメソッドが追加されました:そして以下の表現が追加された:
QkTargetOp: 操作を.でQkTarget表す。
-
C API は現在、シンボルやパラメータ付き式を含むゲートパラメータを表す
QkParamために を公開しています。 インターフェースQkParam自体は、標準的な算術演算や三角関数を含む記号計算をサポートしています。 例:QkParam *x = qk_symbol_new("x"); // a symbol called "x" QkParam *y = qk_symbol_new("y"); // a symbol called "y" QkParam *val = qk_symbol_from_double(2.0); // the value 2.0 QkParam *out = qk_symbol_zero(); // to store the final expression // build 2 sin(x + y) qk_param_add(out, x, y); // out = x + y qk_param_sin(out, out); // out = sin(out) qk_param_mul(out, out, val); // out = out * 2 qk_param_free(x); qk_param_free(y); qk_param_free(val); qk_param_free(out); -
C API では、これを不透明な
DAGCircuitデータとして表現・操作QkDagできるようになりました。 DAGに関連して、以下の機能が追加されました:qk_dag_new()qk_dag_add_quantum_register()qk_dag_add_classical_register()qk_dag_free()qk_dag_copy_empty_like()qk_dag_num_qubits()qk_dag_num_clbits()qk_dag_num_op_nodes()qk_dag_node_type()qk_dag_qubit_in_node()qk_dag_qubit_out_node()qk_dag_clbit_in_node()qk_dag_clbit_out_node()qk_dag_wire_node_value()qk_dag_op_node_clbits()qk_dag_op_node_gate_op()qk_dag_op_node_kind()qk_dag_op_node_num_clbits()qk_dag_op_node_num_params()qk_dag_op_node_num_qubits()qk_dag_op_node_qubits()qk_dag_op_node_unitary()qk_dag_apply_barrier()qk_dag_apply_gate()qk_dag_apply_measure()qk_dag_apply_reset()qk_dag_apply_unitary()qk_dag_get_instruction()qk_dag_compose()qk_dag_topological_op_nodes()qk_dag_substitute_node_with_dag()qk_dag_predecessors()qk_dag_successors()
-
DAGノードの型を区別するための列挙型
QkDagNodeTypeを追加しました。 これはの戻り値のqk_dag_node_type()型です。 -
異なるネイティブ操作タイプを区別するために、列挙型
QkOperationKindを追加しました。 これはの戻り値のqk_dag_op_node_kind()型です。 -
指定された回路のコピーを作成し、元の回路の
qk_circuit_copy_empty_like()鏡像として追加QuantumCircuit.copy_empty_like()します。 -
一部の回路およびDAG API関数で使用するための、コピーモードを指定する新しい列挙型を追加しました:
-
および
qk_dag_successors()の戻り値型である structQkDagNeighborsを追加しqk_dag_predecessors()、それに付随する解放関数 も追加しましたqk_dag_neighbors_clear()。 -
新しい構造体
QkNeighborsが追加されました。これは、`` によって示唆される2量子ビットTarget結合グラフを表すものです。 これはnew関数によって初期qk_neighbors_from_target()化され、でクリアされ、ヘルパーqk_neighbors_clear()関数を持っていますqk_neighbors_is_all_to_all()。 -
DAGから回路への変換および回路からDAGへの変換をサポートするため、それぞれ および
qk_circuit_to_dag()qk_dag_to_circuit()関数を追加しました。 -
関数
qk_transpile()およびqk_transpiler_pass_standalone_unitary_synthesis()は、回路内で3量子ビット以上のUnitaryGateオブジェクトを合成できるようになりました。 Qiskit 2.2 では、3量子ビット以上のユニタリー合成に使用される基盤となるqs_decomposition()合成アルゴリズムが以前は Python で記述されていたため、この機能はサポートされていませんでした。しかし、現在はRustに移植されたため、Cからこの機能を利用できるようになりました。 -
C APIにトランスパイラーステージを実行するための新機能を追加しました。 以下のような関数があります。
C関数トランスパイラ段階qk_transpile_stage_init()初期化段階 qk_transpile_stage_layout()レイアウト段階 qk_transpile_stage_routing()ルーティング段階 qk_transpile_stage_translation()翻訳段階 qk_transpile_stage_optimization()最適化段階 これらの関数は、オブジェクト
QkDag上のプリセットパスマネージャからこれらのステージを実行するために使用されます。 これらの関数の目的は、カスタムトランスパイラパスと組み合わせることで、C言語から構成可能なトランスパイラワークフローを実現することです。 -
マッピング配列から初期レイアウトを設定して
QkTranspileLayoutカスタムを生成するための新qk_transpile_layout_generate_from_mapping()機能を追加しました。 この関数の目的は、カスタムレイアウトトランスパイラパス用のレイアウトオブジェクトを作成できるようにすることです。 -
VF2 サブグラフ同型性アルゴリズムによる「完全」レイアウト選択の2形態が、C APIにおいてスタンドアロンのトランスパイラパスとして利用可能になりました。 これらの関数は
これらは相互作用の方向性とゲートセットの処理方法が異なります。
exactは、すべてのゲートをネイティブに直接サポートすることを要求します。一方、averageは、ゲートが特定の量子ビットまたはリンクでサポートされるセットに分解されることを、さらなるトランスパイラ処理によって期待します。これらの関数は、
QkVF2LayoutConfigurationVF2 設定のラップ版を使用します。このラップ版には、各オプションに対する設定メソッドが用意されています。 これには、引call_limit数の新しい二つの制限形式へのアクセスを許可することも含まれる。
回路の特徴
-
複数の量子ビットに対する共同射影測定を表す新しい命令クラス ``
PauliProductMeasurementを追加しました。この測定における観測量は、パウリ演算子のテンソル積となります。 この測定の結果として得られるのは、 または のいずれかという単一の固有値であり、これはパウリ積の固有状態を示している。追加の背景情報については、ダニエル・リティンスキー著 『表面コードのゲーム:格子手術による大規模量子コンピューティング』 を参照のこと。
A
PauliProductMeasurementは からインスタンス化することがPauliでき、その場合、Pauliは の位相を含み得るが、 や の位相は含めない。この命令は、Pauliと同じ数の量子ビットと、1つの古典ビットを持つ。次に例を挙げます。
from qiskit.circuit import QuantumCircuit from qiskit.quantum_info import Pauli from qiskit.circuit.library import PauliProductMeasurement ppm = PauliProductMeasurement(Pauli("XZ")) qc = QuantumCircuit(6, 2) qc.append(ppm, [4, 1], [1]) -
新しい
QuantumCircuit.to_dag()手法により、.circuit_to_dag()に対して便利なラッパーが提供されるようになった。 -
ParameterExpressionには、そのparametersセットの長さと同じ値を持つ属性num_parametersが追加されましたが、計算にかかるオーバーヘッドは少なくなっています。
OpenQASM 特徴
- OpenQASM 2エクスポーターは、条件が単純なレジスタと整数の等価性検査である場合、単純な
qasm2.dumps()単一IfElseOp命令ブロックの出力をサポートするようになりました。 これは、 OpenQASM 2言語で表現できる内容に対応しています。
QPYの特長
- QPY バージョン 17 では、オブジェクトのパラメータとして使用されるオブジェクト
SparseObservableのシリアライズ形式が追加されました。 特に、これにより、内部でこの演算子を使用するオブジェクトをPauliEvolutionGateシリアライズできるようになり、エボリューション・ゲートのペイロードが更新されます。
量子情報の特徴
-
のミラーサイト
Operator.from_circuit()としてStatevector.from_circuit()追加されました。 これにより、物理量子ビット空間にトランスパイルされた回路であっても、仮想量子ビット空間において直接Statevectorインスタンス化することが可能になる。 -
のみを含む および
front=TrueでQuantumCircuit呼び出された際のClifford.compose()、およびClifford.dot()のパフォーマンスを改善しました。 以前は、まず回路が完全にオブジェクトCliffordとして取り込まれ、その後、2つのオブジェクトが結合されていました。 現在、ベースは反復的にClifford更新されており、これは小規模な回路の場合、処理速度が大幅に向上します。 -
メソッド
PauliLindbladMap.parity_sample()を追加しました。 この方法はPauliLindbladMap.signed_sample()既存の方法と非常に似ていますが、Qiskitの他の部分とより一貫性のある符号の取り扱いを使用しているため、今後は本方法を優先して使用することを推奨します。 インスタンスを変更せずにサンプリングを行う際、レートにスケーリングを適用するための追加のオプション引数が用意されています。 -
やなどのいくつかの「
quantum_info述語」関数は、不要な行列のis_identity_matrix()割り当てを避けるよう最適化されました。
合成機能
-
「
gridsynth_rz()」を追加しました。これは、指定された角度のRZ回転を近似する単一量子ビット量子回路を構築します。 このアルゴリズムは、Neil J. Ross、Peter Selingerによる論文「 Optimal ancilla-free Clifford+T approximation of z-rotations」 で解説されており、 https://github.com/qiskit-community/rsgridsynth に実装されています。 -
特定の単一量子ビットユニタリー行列を近似する単一量子ビット量子回路を構築する関数を
gridsynth_unitary()追加しました。 このアルゴリズムは、ユニタリ行列をRZ回転、RX回転、およびもう1つのRZ回転に分解し、これら3つの回転それぞれにロス・セリンガーアルゴリズムを適用することで機能する。 -
汎用的な単一合成アルゴリズムがRust
qs_decomposition()で書き直され、関数の実行時パフォーマンスが大幅に向上しました。
トランスパイラ機能
-
交換律を利用してゲートの取り消しと結合を行う新しいトランスパイラ・パスを追加しました。
CommutativeOptimizationこのパスは、とCommutativeCancellationの機能を統合しCommutativeInverseCancellation、拡張します。具体的には、パス:
- 逆ゲートペアをキャンセルします。これには、全相対位相まで逆であるペア(必要に応じて全相対位相を調整)も含まれます。
- 可能な場合、連続するゲートを結合しようとする試み。例えば、RZゲート、RXゲート、パウリ回転などの連続したシーケンスなど。
-
トランスパイラ・パス
UnitarySynthesisに新しいオプションを追加しました。fallback_on_defaultこのオプションは、引数で指定されたデフォルト以外の合成プラグインを使用してmethodpassが呼び出された場合に適用されます。デフォルトでは、回路内のすべてのユニタリー演算の合成に、指定されたプラグインが使用されます(ただし、そのプラグインが適用可能な場合に限ります。例えば、ユニタリー演算が定義されている量子ビット数に対応していない場合、そのプラグインは実行されません)。 プラグインがユニタリー演算子を合成できずを返す場合
None、回路内の元のユニタリー演算子は変更されません。 が に設定されているfallback_on_default``True場合、指定されたメソッドが失敗した際には、代わりに プラグインがDefaultUnitarySynthesis呼び出されます。この機能は、カスタムプラグインが全ユニタリ演算子のサブセットのみを扱う場合に特に有用です:適用可能な領域ではユーザーが独自ロジックに依存でき、適用外領域ではデフォルトの合成を利用できます。
-
新しいユニタリー合成プラグインを追加しました。
RossSelingerSynthesisこのプラグインは、Ross-Selingerアルゴリズムを用いて単一量子ビットのユニタリーゲートを合成し、Cliffordゲート、 ゲート、および ゲートからなる単一量子ビット量子回路を生成します。このプラグインは、パラメータがに設定
method``"gridsynth"されたときに、UnitarySynthesisトランスパイラ・パスによって呼び出されます。 -
Clifford+T基底へのトランスパイルを行う際、
UnitarySynthesisトランスパイラ・パスはデフォルトでClifford+T合成アルゴリズムを使用し、単一量子ビットのユニタリー演算を近似するようになりました。同様に、この
DefaultUnitarySynthesisプラグインでは、単一量子ビットのユニタリー演算を近似するために、同じClifford+T合成アルゴリズムが使用されるようになりました。 -
新しい
DAGCircuit.to_circuit()手法により、.dag_to_circuit()に対して便利なラッパーが提供されるようになった。 -
角度が の整数倍である単一量子ビットの回転ゲート、
RXGateRZGateおよびRYGate回転ゲートを、クリフォードゲート、TGateおよびTdgGateゲートのSubstitutePi4Rotations離散的な集合に変換する新しいトランスパイラーパスを追加しました。 なお、 の奇数倍には単一のTGateおよび に加え、いくつかのクリフォードTdgGateゲートが必要となるのに対し、 の偶数倍、あるいは等価に の整数倍は、クリフォードゲートのみを用いて記述することができる。 -
トランスパイラ・パスが拡張
LitinskiTransformationされ、計測に対応するようになりました。 したがって、この変換は、クリフォード演算、単一量子ビットのRZ回転ゲート( および を含む)、および標準的なZ測定を含む回路に適用され、クリフォード演算を回路の最後に移動させる。 その過程で、RZ回転をパウリ回転の積(ゲートPauliEvolutionGateとして実装)に変換し、Z測定をパウリ測定の積(命令PauliProductMeasurementを用いて実装)に変換します。 -
トランスパイ
OptimizeCliffordTラの最適化パスは大幅に強化され、Rustで再実装されました。このパスは、クリフォード+Tゲートセットを用いて表現された回路に対して、覗き穴最適化を実行する。 より正確には、クリフォード+Tを含む単一量子ビットゲートのすべての連鎖を、 (または )の最小使用量に折りたたむ。このパスは、連鎖内のゲート数に比例する時間で連鎖に対して実行される。
-
.
WrapAnglesのデフォルトのレジストリを含むものをWrapAngles.DEFAULT_REGISTRY追加しました。 この新しい属性は以前の属性に取ってWRAP_ANGLE_REGISTRY代わるものであり、下流のユーザーの皆様には、できるだけ早く新しい形式に変更されることをお勧めします。 -
メソッド
DAGCircuit.topological_nodes()DAGCircuit.topological_op_nodes()とメソッドは、ブールreverse型の引数をサポートするようになりました。 この設定にするとTrue、メソッドは回路の出力側から入力側へと向かう、逆トポロジ順でノードを返します。 これにより、関数が返すノードのリストを明示的に逆順に変換したり、構造的に逆順になった新しいDAGを作成したりするといったオーバーDAGCircuit.reverse_ops()ヘッドを伴わずに、DAGを逆方向に反復処理するための直接的かつ効率的な方法が提供されます。 -
このアルゴリズムは
CommutationChecker、生成するパウリ演算子が可換であるかどうかを確認することで、パウリ演算子PauliProductMeasurementに基づくゲートPauliGate、PauliEvolutionGate、および 間の可換性チェックを効率的に行うようになりました。 これにより、特にパウリ進化やパウリ積の測定を用いて表現される、パウリベースの計算形式の回路に対する最適化が可能となる。 なお、これらのパウリ演算に基づくゲートと他の標準的なゲートとの間の変換については、現時点では同様の効率的な方法で処理されていません。 -
に新しい引数 を
CommutationChecker.commute()追加しました。matrix_max_num_qubitsこれにより、交換チェック機能が指数関数的に計算コストの高い行列表現を計算することを許可される命令の範囲を制限することができる。 この新しい引数により、処理対象の命令数の上限(デフォルト値max_num_qubitsはNone新たに に設定されており、上限なしを意味する)と、行列サイズの上限とを区別できるようになります。 -
関数
generate_preset_pass_manager()および は、Clifford+T 基底セットtranspile()へのコンパイル時に引数unitary_synthesis_methodを考慮するようになり、これによりカスタムユニタリー合成プラグインを呼び出すことが可能になりました。 -
VF2LayoutそしてVF2PostLayout、サブグラフ同型マッチングの過程で、部分的な候補レイアウトのスコアを追跡する。 最適なレイアウトが見つからない場合には、これによる効果はほとんどありませんが、対称性の高いケースでは、最適な候補を選ぶためのレイアウトの評価コストを大幅に削減することができます。 -
と
VF2Layoutのcall_limit引数は、2つの要素からVF2PostLayoutなるタプルにできるようになりました。最初の要素は最初の一致が見つかる前に使用され、その後、limit は2番目の要素に切り替わります。 レイアウトの評価が、より積極的な剪定を用いて実行時に即座に行われるようになったため、これはmax_trialsargumentよりも信頼性の高い実行時間制限機能です。
その他の機能
sampled_expectation_value()関数``を使用して、Z基底でサンプリングされたビット列からSparseObservableaの期待値を計算する機能を追加しました。
アップグレードの注意
ConsolidateBlocks現在、エントリ時にConsolidateBlocks_qubit_mapキーPropertySetを読み込む。 このキーとその値は公開されておらず、他のパスから読み取ったり書き込んだりしてはなりません。
C API アップグレードに関する注意事項
qk_target_entry_new_fixed()ターゲットエントリの名前を設定するための追加のnameパラメータがあります。 固定角度のエントリは、正しく機能させるために、ほぼ例外なく標準ゲートの名前を上書きする必要があります。
回路アップグレードに関する注意事項
-
標準回路ライブラリゲートの定義として生成される回路の名前は、現在 に設定されています
None。 以前は、これらの回路はゲートと同じ名前を持っていたため、標準ゲートと名前が一致する不透明ゲートを非常に簡単に構築することができた。 これはQiskitにおける一般的な前提に反します。標準ゲート名は一意であるべきです。 -
s が a
QuantumCircuitまたは bControlFlowOpに追加されると、sDAGCircuitの内部表現が変更されます。 回路に格納され、将来のアクセス時に返されるオブジェクトは、必ずしもその回路に追加されたインスタンスと同じであるとは限りません。 オブジェクトが回路に追加された後は*、その*オブジェクトをその場で変更しようとしないでください。 これは、制御フローであれ他のオブジェクトであれ、回路を破損させる可能性が高い。Pythonオブジェクトに対して[QuantumCircuitやDAGCircuit[内に格納された状態で変更を加える場合と同様に、Rust がその変更を反映させるためには、その命令を回路に再割り当てする必要があります。 たとえば、回路上にすでに存在するBoxOpに注釈を追加する場合、トランスパイラ処理では、Rust 空間のオブジェクトを更新DAGCircuit.substitute_node()するために を使用するようにする必要があります:from qiskit.circuit import QuantumCircuit, Annotation class MyAnnotation(Annotation): namespace = "my" qc = QuantumCircuit(2) with qc.box(): qc.cx(0, 1) dag = qc.to_dag() # Modifications to the box's annotations in-place require # writing back the information to Rust space. box_node = next(dag.topological_op_nodes()) box_node.op.annotations.append(MyAnnotation()) # Write back the operation. dag.substitute_node(box_node, box_node.op) -
Qiskit 2.3 では、制御フローの内部表現を、従来の Python 中心の形式から Rust ネイティブの形式へと移行しているため、
jumpを含むBoxOpjumpControlFlowOp命令が存在する場合、トランスパイラのパフォーマンスが一時的に低下すると予想されます。 今後のQiskitのバージョンでは、パフォーマンスがさらに向上し、制御フロー演算を処理するトランスパイラ・パスにおける長年のAPI上の課題が解決されるものと期待しています。 -
インスタンス
ControlFlowOpのブロックは、もはや やmetadataフィールドnameを追跡しなくなります。 これらはもともと、制御フロービルダーのインターフェースでは設定不可能であり、その存在は意図的なAPIというよりは、意図しない実装上の詳細に過ぎませんでした。 -
引数 arg
annotatedがtrueに設定され、ネイティブの制御Trueゲートクラスが利用可能な場合、このメソッドAnnotatedOperationは nullGate.control()を返さなくなりました。 この変更は、標準回路ライブラリ全体における引数のannotated使用方法と整合しており、制御アノテーションが付けられたゲートのより効率的な分解を可能にします。 影響を受けるゲートは以下の通りです:- 単一制御の
H、S、Sdg、U3Y、Z、、SX、RX、RY、RZ、、SwapおよびCZゲート; - 二重
Z制御ゲート; - 任意に制御された
Phase,CPhase,MCPhase,U1,CU1,MCU1およびMCMTゲート。
- 単一制御の
-
引数 のデフォルト
annotated値は、 からQuantumCircuit.control()に変更NoneされましたFalse。 これは実際の回路には影響しませんが、回路ライブラリ全体で使用annotatedされているデフォルト値と整合しています。
QPY アップグレードに関する注意事項
- でデフォルトで使用されるQPY
qpy.dump()のバージョン(QPY_VERSION)は、現在17です。
量子情報アップグレードに関する注意事項
- クビット数に応じてスケーリングが劣る専用のショートカットではなく、最適化された一般ケースの実装を採用することで、全恒等パウルイ演算
Statevector.expectation_value()子のパフォーマンスを向上させた。
トランスパイラ アップグレード ノート
-
[
VF2PostLayoutat] における完全一致実行の最大呼び出し回数および試行回数の制限は、高度に対称的なoptimization_level=3試行回路が大きな結合マップにマッピングされることによる過度な実行時間を回避するために引き下げられました。 -
トランスパイラ・パ
WrapAnglesスのデフォルトのレジストリの推奨保存場所は、現在 ですWrapAngles.DEFAULT_REGISTRY。 下位互換性を確保するため、従来の深くネストされたWRAP_ANGLE_REGISTRYパスは引き続き機能しますが、下流のパッケージでは新しい場所を使用することを推奨します。 以前のパスは、Qiskit 2.2 における見落としであり、公開APIの一部となることを意図していなかったモジュールを経由していました。 -
および
VF2LayoutへのインターフェースはVF2PostLayout論理的には変わらないものの、引max_trials数は、1値に設定された場合を除き、実行時の制限としての効果が大幅に弱まっています。 これは、このクラスが内部で使用する新しいオンザフライのスコア・アンド・プルーニングアルゴリズムにより、「完全な」レイアウトに遭遇する頻度が大幅に低下し、「試行」のカウントは、以前のものよりも誤り率が低い新しいレイアウトに遭遇した場合にのみ増加するためです。 代わりに、決定論的な実行時間制限としてcall_limitを使用すべきです。ここで、max_trialsは遭遇した完全なレイアウトを計測し、call_limitは部分レイアウトの拡張を計測します。
各種アップグレードに関する注意事項
-
Python の最小サポートバージョンは、2025年10月に Python のサポート終了( 3.9 )およびQiskitにおける非推奨警告( 2.1 以降)に伴い、 3.10 に変更されました。
-
macOS x86-64 (Intel) のサポートがティア1からティア2に格下げされました。 Qiskitはこのプラットフォーム向けにテスト済みで事前コンパイル済みのWheelを提供し続けますが、テストはリリース時のみ実施され、変更のたびに実行されるわけではありません。 これにより、このプラットフォーム向けのホイールのリリースが遅れる可能性があります。
この変更は、Appleがプラットフォームのサポート終了を開始したため、またQiskitチームには第一級サポートを継続するための開発者リソースやCIリソースが残されていないため実施されました。 macOS x86-64 のサポートは、 GitHub がランナーの提供を継続している間のみ可能です。 このサポートは2027年後半に終了する見込みです。
C API の非推奨化
-
この
qk_transpiler_pass_standalone_vf2_layout()関数は非推奨となりました。呼び出し元は、今後は を使用する必要がありますqk_transpiler_pass_standalone_vf2_layout_average()。 新しい関数名は、スコアリングのヒューリスティックをより的確に表しており、API では、2 つの制限値形式を含む新しい設定call_limitオブジェクト全体に対して、カプセル化されたアクセスが可能になっています。この非推奨化はユーザーにとって必ずしも必要ではありませんが、C APIが依然として明示的に不安定な状態にあるため、安定性の保証に到達する前に、C APIにおける非推奨処理とコンパイラ固有の警告の管理方法を試行する目的で使用しています。
回路の廃止予定
-
Qiskit 1.0 以降、メソッド
Gate.control()および は引数QuantumCircuit.control()を受け付けannotated、その値は、False、Trueまたは のいずれかNoneになります。 現在、制御ゲートが存在する場合、の値にかかわらず、専用の制御ゲートクラスannotatedを使用して表現されます。例えば、の2制御版はXGateですCCXGate。 専用の制御ゲートクラスが存在しない場合、制御ゲートは のときはControlledGateannotated=Falseとして、 のAnnotatedOperationときは として表現annotated=Trueされる。 デフォルト値は、とannotated=Noneまったく同じように扱われますFalse。Qiskit では 3.0、 の設定を許可せず
annotated=None、代わりにデフォルトを に変更します。annotated=Trueこれは推奨される手法である。制御回路の構築を回路設計段階からトランスパイラ段階へ遅延させ、追加の制御ゲート最適化を可能にするため、通常はより高品質な回路(特に階層的回路において)を実現する。ただし、以前の動作を維持
annotated=Falseするために明示的に設定することは引き続き可能です。
トランスパイラーの非推奨機能
- Python の形式で基本的な近似値をピクルス化していた、
SolovayKitaevDecompositionで用いられていたdict旧式のシリアライズ形式は非推奨となりました。 読み込み処理はセキュリティ上の脆弱性となる可能性があるため、信頼できるファイルに対してのみ使用してください。 新しいシリアライズ形式では、この脆弱性が回避されています。 レガシー形式を生成する関数、generate_basic_approximations()およびそれを読み込む関数、SolovayKitaevDecomposition.load_basic_approximations()ならびに の初期化子内の関数はSolovayKitaevDecomposition、非推奨となりました。 その代わりに、クラス初期化子内で安全に読み込める形式を生成するためにSolovayKitaevDecomposition.save_basic_approximations()を使用してください。
ビルドシステムの変更
- ソースからQiskitをビルドまたはパッケージングする場合、必要となるsetuptoolsのバージョンは、少なくとも 77.0 (2025年3月リリース)以上である必要があります。 これはPEP 639の新しいライセンスメタデータ仕様をサポートするものです。 この依存関係はビルド要件で指定されているため、手動での操作は不要です。
バグ修正
-
回路パラメータのディープコピーが行われて
__deepcopy__()いなかった 内の実装QuantumCircuitを修正しました。 その結果、コピーされた回路内のBoxOpを変更しても、元の回路には影響しなくなりました。 -
DAGCircuit.apply_operation_back()、apply_operation_back()そして、これからは確定的なcircuit_to_dag()順序で新しいエッジを追加します。 以前の動作では、特定のトランスパイラ・パス(例えばSabreSwap)が、非決定論的な順序でDAGを走査してしまう可能性がありました。 -
DAGCircuit.apply_operation_front()従来の条件を含むノードを処理する際、無効な自己ループを挿入できなくなりました。 -
固定角度パラメータを持つ 1q ゲートを含む
Targetパスで初期化された場合Optimize1qGatesDecompositionの問題を修正しました。 以前は、ターゲット内のゲートが任意のパラメータ値に対応しているかどうかを確認していなかったため、このパス処理により、ターゲットの範囲外のゲートが出力される可能性がありました。 #14743 を修正しました。 -
ブロック
ControlFlowOp内のマルチ量子ビットゲートが、ソース回路の絶対インデックスを使用する代わりに、ローカル量子ビットインデックスに基づいて追跡してしまうという、パスBasisTranslatorにおける不正な動作を修正しました。 -
複数の回路で同じ
ConsolidateBlocksインスタンスが再利用される問題を修正しました。これには、複数の回路を使用transpile()する呼び出しや、プロセスベースの並列化が行われていないケースも含まれます。 Qiskit 2.2.2 に導入されたバグにより、異なる回路で同じインスタンスが再利用された場合、パスがパニックを起こすか、無効な出力が生成される問題が発生していました。 -
トランスペイラー・パス
ConsolidateBlocksは、制御フロー演算を再帰処理する際、指定されたゲートがハードウェアでサポートされているかどうかを正しく評価するようになりました。 -
qpy.dump()QPY バージョン 16 以降では、標準ライブラリのgzipmoduleを使用して開いたファイル.gzへの書き込みが可能になりました。 詳細は #15157 を参照してください。 -
逆関数を計算する際に、開制御ゲートの制御状態が保持されるよう、メソッド
MCPhaseGate.inverse()MCU1Gate.inverse()および を修正しました。 -
ConsolidateBlocksレガシーキーrun_listorPropertySetblock_listにおいて無効または古い分析が検出された場合、以前はパニックを起こしていましたが、今後はPython -space例外を返すようになります。 -
Optimize1qGatesDecomposition. に対して大きすぎる回路上で実行Targetしようとすると、RustのスペースTranspilerErrorパニックではなく、. が発生するようになります。 -
メソッド
SabreSwap.run()の実行後にインスタンスSabreSwapをpickle化しようとするとpickleエラーが発生していたSabreSwap問題を修正しました。 #15071 を修正しました。 -
スケジューリングパスと
ALAPScheduleAnalysisはASAPScheduleAnalysis、操作が含まれていない回路を正しく処理するようになりました。 以前は、「有効期限が指定されていません」という誤ったTranspilerErrorエラーメッセージが表示されていました。 #15145 を修正しました。 -
演算子が単位行列であるかどうかを検証する際、入力の許容誤差値が正しく反映されていなかった
is_unitary()問題を修正しました。 このメソッドは、演算子を簡略化し、それが恒等式と等しいかどうかを確認する際に、指定されたatolおよびrtolパラメータを正しく使用するようになりました。 これで #14107が修正されました。 -
トランスポイラー・パス
UnitarySynthesisにおけるバグを修正しました。このバグは、デフォルト以外の合成プラグイン(経由で指定されたmethodもの)が をサポートbasis_gatesしているが をサポートしていない場合に発生していましたtarget。 このパスにより、ベースゲートが からtargetプラグインへ正しく渡されるようになりました。 -
制御フロー演算内の回路ブロックが、外側の回路とは異なるレジスタで定義された場合に発生する可能性があった、回路テキストドローワーの不具合を修正しました。 このような状況は、例えば、演算を直接
ControlFlowOp追加する場合や、トランスパイル後の回路において発生する可能性があります。 -
QPY バージョン 17 を使用する際、
SparseObservable型 の演算子を用いたPauliEvolutionGateシリアライズ機能の不具合を修正しました。 -
``に格納された配列の長さが、
QkTargetOpQkTargetOp.paramsによって公開された数値と一致しないというQkTargetOp.num_params不整合を修正しました。 ワイルドカードパラメータは、現在NANで表され、配列の長さは常に となりますQkTargetOp.num_params。 この不具合は、 2.3.0rc1 でのみ発生していました。 -
幅が64ビットを超える型の
ValueUint古典的表現における回帰不具合を修正しました。 以前は、これらの型を持つ式の値が内部で意図せずdouble型の浮動小数点値に変換され、その結果、精度が失われていました。 -
この
HighLevelSynthesisパスでは、ベースセットに応じて最適化指標が正しく選択されるようになりました。連続ベースの場合は2量子ビットゲート数、クリフォード+Tベースの場合はT数となります。 以前は、この情報が正しく反映されていなかったため、Tカウントが予想よりも低くなっていました。 -
回路テキスト描画機能を修正し、古典的な配線方式の回路指示が別々のレイヤーに描画されるようにしました。
-
と の
Operator間の行列Statevector乗算(@)は、演算子を状態に適用し、その結果として をStatevector返します。 -
1量子ビットの順列処理中にクラッシュする原因となっていた、
ElidePermutationsトランスパイラ・パスのバグを修正しました。 -
複数の回路を含む
transpile()またはPassManager.run()を実行するマルチプロセッシング環境において、 およびTargetの接続性が不連続なSabreLayout状態でレイアウト処理を実行した際に発生する可能性のあるデッドロック問題を修正しました。 Linux では、複数の回路を指定してtranspile()またはPassManager.run()を実行した場合、これがデフォルトの動作となります。その他のすべてのプラットフォームでは、マルチプロセッシングコンテキストを使用するには明示的に設定する必要があります。これは、マルチプロセッシングとマルチスレッドを混在させる際に python/cpython#84559 発生する、CPythonの根本的な問題によるものでした。 通常、Qiskitは2種類の並列処理手法の混在を防ぐが、分離された接続性グラフを扱う場合、マルチスレッド化されたRustコード周辺でこの保護が欠けていた。
-
このメソッドは、以前は無視していた
Statevector.to_dict()キーワードdecimals引数を、これからは考慮するようになります。 -
ターゲット内に持続時間が設定されたパラメータ化ゲートが含まれている場合、そのターゲットからスケジュールされた回路を可視化しようとするとエラー
timeline_drawer()が発生していた問題を修正しました。 -
「with
SparseObservable」演算子を使用したPauliEvolutionGateラベル生成を修正しました。 ラベルには、連鎖した文字列形式(例:"XX"``"X0 X2")ではなく、キュービットの添え字付きパウリ演算子(例:)が表示されるようになり、異なる演算子を区別しやすくなりました。 -
Pauli.evolve()特定のパラメータ化された回転ゲートを含む量子回路について、角度が の倍数である場合、正しく処理されるようになりました。例えば、RZGate(math.pi/2)またはRZZGate(math.pi/2)。 以前はこれらがクリフォードゲートとして認識されず、エラーが発生していました。 -
BasePassManagerパスからの出力結果が「falsy」ではなく「valid」であっても、元の入力プログラムに置き換えることはなくなりました。 パスが返される場合0、Falseまたはその他の偽値の場合、結果は保持されるようになり、失敗を示すのはNoneのみとなります。 -
QuantumCircuit.compose()引var_remap数が指定された場合、命令Delay内で使用されている変数やストレッチが正しく再マッピングされるようになりました。