Qiskit SDK 2.2 リリースノート
2.2.3
前奏曲
Qiskit 2.2.3 では、複数の回路に対して PassManager で run() メソッドを使用するときに Qiskit 2.2.2 で導入されたバグが修正されています。
アップグレードの注意
ConsolidateBlocksエントリでConsolidateBlocks_qubit_mapキーPropertySetを読み取ります。 このキーとその値は公開されておらず、他のパスによって読み書きされるべきではありません。
バグ修正
- 複数の回路で同一
ConsolidateBlocksインスタンスを再利用する問題を修正。これには、複数の回路をtranspile()伴う呼び出しやプロセスベースの並列化がないケースも含まれる。 Qiskit 2.2.2 で導入されたバグにより、異なる回路で同じインスタンスが再利用された場合、パスがパニック状態になるか無効な出力を生成する問題が発生しました。
2.2.2
前奏曲
Qiskit 2.2.2 は、 v2.2 マイナーバージョンシリーズのバグフィックスリリースです。
バグ修正
-
回路パラメータ
__deepcopy__()の深部コピーが行われていなかった実装QuantumCircuitを修正しました。 その結果、コピーされた回路BoxOp内の変数を変更しても、元の回路には影響しなくなる。 -
固定角度パラメータを持つ1量子ビットゲートを含む
Targetパッシブでパッシブが初期化される際のOptimize1qGatesDecompositionパッシブの問題を修正しました。 以前は、ターゲットに含まれていないゲートを出力する可能性がありました。これは、ターゲット内のゲートが任意のパラメータ値をサポートしているかどうかを確認していなかったためです。 #14743 を修正しました。 -
修正
BasisTranslator内容:ブロックControlFlowOp内のマルチ量子ビットゲートが、ソース回路からの絶対インデックスではなくローカル量子ビットインデックスを使用して追跡する誤った動作を修正しました。 -
トランスパイラパス
ConsolidateBlocksは、制御フロー操作への再帰処理中に、特定のゲートがハードウェアでサポートされているかどうかを正しく評価するようになりました。 -
qpy.dump()QPYバージョン16以降では、標準gzipライブラリモジュールで開かれたファイル.gzへの書き込みが可能になりました。 詳細は #15157 を参照してください。 -
開状態制御ゲートを逆演算する際に、その制御状態を保持
MCPhaseGate.inverse()する方法を修正しました。 -
ConsolidateBlocksレガシーのrun_listまたは ``block_listPropertySetキーで無効または期限切れの分析を検出した場合、パニックを起こす代わりに、 Python -space 例外を返すようになります。 #14646 を修正しました。 -
Optimize1qGatesDecompositionが、に対して大きすぎる回路上でTarget実行を試みた場合、Rust空間TranspilerErrorパニックではなくを発生させるようになります。 #15116 を修正しました。 -
スケジューリングパスは、
ALAPScheduleAnalysisおよびASAPScheduleAnalysis、操作を含まない回路を正しく処理するようになりました。 以前、彼らは「期間が提供されていない」と虚偽の主張をしてTranspilerError提起した。 #15145 を修正しました。 -
回路テキスト描画機能の不具合を修正しました。この不具合は、制御フロー操作内の回路ブロックが、外側の回路とは異なるレジスタ上に定義された場合に発生する可能性がありました。 この状況は、例えば操作を直接
ControlFlowOp追加する場合や、トランスパイル後の回路において発生する可能性がある。
2.2.1
前奏曲
Qiskit 2.2.1 は、 2.2.0 リリースで確認されたいくつかのバグを修正した小さなパッチリリースです。
トランスパイラ アップグレード ノート
- 完全一致実行の最大呼び出し数および試行回数の制限値が
VF2PostLayout、大規模結合マップにマッピングされる高対称性試行回路における過度の実行時間増加を回避するため、optimization_level=3削減されました。
バグ修正
-
DAGCircuit.apply_operation_back(),apply_operation_back()そして 新しい辺を確定circuit_to_dag()的な順序で追加します。 以前の動作では、特定のトランスパイラ処理(例:SabreSwap)がDAGを非決定的な順序で探索する可能性がありました。 -
DAGCircuit.apply_operation_front()古典的条件を含むノードを処理する際、無効な自己ループを挿入できなくなった。 -
メソッド
SabreSwap.run()実行後にインスタンスSabreSwapSabreSwapをピクル化するとエラーpickleが発生する問題を修正しました。 #15071 を修正しました。 -
演算子がユニタリであるかどうかのチェックにおいて、入力許容値が正しく反映されない
is_unitary()問題を修正しました。 このメソッドは、演算子を単純化し、それが恒等演算子と等しいかどうかを確認する際に、提供されたatolおよびrtolパラメータを正しく使用するようになりました。 これは #14107 を修正します。
2.2.0
前奏曲
Qiskit v2.2 は、C APIとトランスパイラのいくつかの機能強化に加え、その他多くの改良とバグ修正を加えています。 この新リリースの主な特徴は以下の通り:
- C API トランスパイル関数: C API に量子回路をトランスパイルする関数が追加されました:
qk_transpile(). この関数は、スタンドアロンのCコンテキストにおける Pythontranspile()関数と同等です。- リティンスキー変換パス: 記述された変換を実装する arXiv:1808.02892 新しい変換パス
LitinskiTransformation。 このパスは、通常、フォールトトレラントアーキテクチャのコンパイル時に使用されます。- ターゲットに対する角度境界サポート: この
Targetクラスは、ターゲットに追加されたパラメータ化操作の許容値に対して境界を指定する機能をサポートするようになりました。 命令が追加されると、オプション引数 angle_bounds を指定してTargetパラメータ化された回転ゲートの上限と下限を指定できます。 トランスパイラ処理の新たなパスがWrapAngles追加され、トランスパイラ処理パイプラインの一環として角度制約を強制するようになりました。
v2.2 リリースシリーズは、 Python 3.9 をサポートする最後のマイナーリリースシリーズです。 Qiskit をソースからビルドする際に使用する Rust の最小サポートバージョンは Rust v1.85 となり、 2.1.0 の 1.79 から引き上げられています。 上記およびその他の変更点の詳細については、以下のリリースノートおよび更新されたドキュメントをご覧ください。
C API の機能
-
C APIに新しいスタンドアロン・トランスパイラー・パス・ファンクションを追加。 これらの関数は、パスを実行する
QkCircuit、インスタンス化されたパスを呼び出すのと同じです。 -
この
QkTarget型は、任意のパラメータ値を受け入れるパラメータ化QkGate型をサポートするターゲットを表すことができるようになりました。 以前は、これらのゲートは固定角度値でターゲットに追加するしかなく、それにはを使用してqk_target_entry_new_fixed()を作成する必要がありましたQkTargetEntry。 現在、このqk_target_entry_new()関数はパラメータ化されたゲートと共に使用できます。 この関数は、パラメータ化されたゲートと併用される場合、対象のゲートがそのすべてのパラメータに対して任意の値をサポートしていることを示す。 例:#include <qiskit.h> QkTarget *target = qk_target_new(5); QkTargetEntry *rz_entry = qk_target_entry_new(QkGate_RZ); for (uint32_t i = 0; i < 5; i++) { uint32_t qargs[1] = {i}; qk_target_entry_add_property(rz_entry, qargs, 1, 1.2e-6, 1.3e-9); } qk_target_add_instruction(target, rz_entry); // Clean up after using target qk_target_free(target);これは5量子ビットのターゲットを作成し、そのゲートがサポートする任意のパラメータ値を持つ任意の量子ビットのRZゲートを受け入れます。
-
観測
QkObs対象に新しい量子ビットレイアウトを適用するためにqk_obs_apply_layout()追加されました。 この関数は、観測可能なオブジェクト、新しい量子ビットのインデックス、および出力量子ビット数を受け取ります。 重要な点として、この関数はトランスパイラによる処理QkTranspileLayoutで通常指定されるトランスパイルレイアウトをオブザーバブルに適用することを可能にします。 例:// get the number of output qubits -- transpile_layout is a QkTranspileLayout* uint32_t num_output_qubits = qk_transpile_layout_num_output_qubits(transpile_layout); // get the layout including the ancillas (hence the ``false`` in the function call) uint32_t *layout = malloc(sizeof(uint32_t) * num_output_qubits); qk_transpile_layout_final_layout(transpile_layout, false, layout); // apply the layout -- obs is a QkObs* int exit = qk_obs_apply_layout(obs, layout, num_output_qubits); // free the layout array free(layout); -
Qiskit C API
qk_transpile()に新機能を追加しました。 この関数は、 Python を使用せずに、スタンドアロンのCコンテキストで量子回路をトランスパイルするために使用されます。 これは、Qiskitを使用した典型的なハードウェア実行ワークフローにおいて、C APIで必要とされる最後の主要コンポーネントです。この関数は、 Python トランスパイラで使用されるプリセット・パス・マネージャを反映しているが、C API を使用して構築された回路に関連しないパスや機能はスキップされる。 このため、この関数はスタンドアロンCコンテキストにのみ適している。
-
C API に新しい型
QkTranspileLayoutを追加。 この型は、トランスパイラによる順列の推論に使われる。
回路の特徴
-
新しい手法が提供され、回路が物理量子ビット
QuantumCircuit.ensure_physical()上で定義され、量子ビットのインデックスが物理量子ビットを指すことを保証する。 メタデータの概念に関する詳細は、 ドキュメント内の抽象回路と物理回路の表現に関する新たな議論を参照してください。 「抽象的」回路と「物理的」回路の概念は、Qiskitにとって全く新しいものではなく、明示的なドキュメントが追加されただけです。 -
Durationクラスは、ピコ秒単位で持続時間を表すことができる新しいps。 -
改良され
PauliEvolutionGate.control()、より効率的な表現PauliEvolutionGate.power()を返すためにPauliEvolutionGate.inverse()、a に関してPauliEvolutionGate。 この変更により、従来使用されていた汎用的な手法と比較して、制御された進化ゲートおよび指数化された進化ゲートの計算において、回路が大幅に浅くなり、ゲート数が減少する。 逆分解自体は変化しないが、より効率的に生成されるようになり、コンパイラの最適化が向上する。 -
新しい高速パス方式
ParameterExpression.bind_all()が追加され、同一のマッピング辞書を用いて多数の異なるParameterExpressionインスタンスを数値値にバインドするユースケースをサポートします。 既存のbind()メソッドは、型の一貫ParameterExpression性を保つために常に返すため、大量のオーバーヘッドと不要な割り当てが発生している。
OpenQASM 特徴
-
OpenQASM3
defcalエクスポーターにおける記号への部分的なサポートを追加しました。 これにより、下流のパッケージは量子ビットと古典ビットの両方に対して動作するカスタム命令をqiskit.qasm3.dumps()エクスポートできるようになります。 ユーザーはカスタム命令(例:量子ビットに対して作用し、古典ビットCustomMeasureを返す命令)を定義し、その動作を指定できるようになりましたDefcalInstruction。 これらのデファカルは、引数implicit_defcalsを通じてエクスポーターqiskit.qasm3.dumps()に渡されます。例:
from qiskit.circuit import Instruction, QuantumCircuit from qiskit.qasm3 import dumps from qiskit.qasm3.exporter import DefcalInstruction, types custom_measure = Instruction("measure_2", 1, 1, []) qc = QuantumCircuit(1, 1) qc.h(0) qc.append(custom_measure, [0], [0]) qc.measure(0, 0) defcals = { "measure_2": DefcalInstruction("measure_2", 0, 1, types.Bool()), } out_qasm = dumps(qc, implicit_defcals=defcals) print(out_qasm)次のような OpenQASM3 :
OPENQASM 3.0; bit[1] c; qubit[1] q; h q[0]; c[0] = measure_2 q[0]; c[0] = measure q[0];このアプローチは、defcalの文法定義が外部(例えばヘッダーファイル)で提供されることを前提としているが、エクスポータが機能するためにそのようなファイルが厳密に必要なわけではない。
-
関数
qasm3.loads()とqasm3.load()には、 という名前の追加引数がnum_qubits追加されました。 指定された場合、関数は量子ビットが に等しい回路をnum_qubits返します。 指定しない場合、返される回路の量子ビット数はシリアル化された回路で観測された最大インデックスに等しくなります。 詳細は#14435 を参照してください
QPYの特長
-
ユーザー設定ファイルに という
min_qpy_version名前の設定を追加しました。 設定すると、.qpy.load()に対して許可される最小の QPY バージョンを定義します。 QPYファイルのフォーマットバージョンが設定minimum_qpy_version値minimum_qpy_versionよりも低い場合、例外が発生します。 -
QPYフォーマット・バージョン16を導入。 この新バージョンでは、QPYファイル内の各回路の開始バイト・オフセットを含む新しい回路開始テーブルがファイル・ヘッダーに導入された。 これにより、QPYファイルから回路をより効率的にロードできる可能性があり、将来的にはRustの実装をマルチスレッド化できる可能性がある。 さらに、新しいフォーマット・バージョンでは、
DURATIONピコ秒の新しいバリアントがサポートされている。
量子情報の特徴
-
Pauli Lindblad写像からサブシステムを追跡するための および
PauliLindbladMap.keep_qubits()PauliLindbladMap.drop_qubits()メソッドを追加した。 -
スパースオブジェクトを対応する密オブジェクトに変換するメソッド
QubitSparsePauli.to_pauli()およびPauliListQubitSparsePauliList.to_pauli_list()Pauliを追加しました。 -
と
PhasedQubitSparsePauliListPhasedQubitSparsePauliクラスを追加しました。 これらのクラスは、それぞれ単一のパウリ演算子とパウリ演算子のリストを、量子ビット疎形式で格納したものです。 これらのクラスは、とQubitSparsePauliListQubitSparsePauli、およびと非常に似ていますが、これらはさらに位相情報を含んでいます。 -
メソッドを追加しました
QubitSparsePauliList.to_dense_array()。 これは、値のリストを整数の配列Pauliとして返します。
合成機能
-
補助量子ビットを必要とせず、
ModularAdderGate従来のアルゴリズムと比較してCXカウントが向上した新たなadder_qft_d00()合成アルゴリズムを追加しました: -
補助量子ビットを一切必要と
MCXGateしない、synth_mcx_noaux_hp24()新しい合成アルゴリズムを追加しました。 この手法は、既存のsynth_mcx_noaux_v24()アルゴリズムと比較して、CXゲートの数が二次的ではなく線形に増加する。 特に、制御量子ビットの数が5を超える場合、この新しい手法がより優れている。 このアルゴリズムは、HuangとPalsbergによる論文「補助量子ビットを使用せずに条件付き量子ゲートをコンパイルする」に基づいている。 https://dl.acm.org/doi/10.1145/3656436 -
当初Shendeらに基づく機能を
qs_decomposition()改良した。 al. (https://arxiv.org/abs/quant-ph/0406176). 新しい合成法はKrolとAl-Ars( https://arxiv.org/abs/2403.13692 )に基づくものであり、一般のn量子CXGateビットユニタリ演算子の総s数をCXGates減少させる。 分解法の改良により、一般的な3量子ビットユニタリ演算は19CXGate秒(従来の20秒ではなく)で分解できる。 -
ベースゲートが. の場合
XGate、マルチ制御マルチターゲットゲートを合成するためにsynth_mcmt_xgate()追加された。 これは、高レベル合成プラグインと共にMCMTSynthesisXGate、線形数のCXゲートと0個の補助量子ビットによる分解を持つ。
トランスパイラ機能
-
新しい高レベル合成プラグインを追加し、以下を合成します
ModularAdderGate:また、以下の順序でモジュラー加算器合成器を実行するように更新
ModularAdderSynthesisDefaultされました:量子ビット数が"ModularAdder.qft_d00"の場合、それ以外の"ModularAdder.modular_v17"すべてのケースでは。 -
新しいトランスパイラパスを追加しました
LitinskiTransformation。これはで説明されている変換 arXiv:1808.02892 を実装します。このパスの入力は、クリフォードゲートと単一量子ビットRZ回転ゲートを含む回路であり、出力は多量子ビットパウリ回転(ゲート
PauliEvolutionGateとして実装)に続いてクリフォードゲートを含む回路である。 回路に非対応ゲートが含まれる場合、パスは例外TranspilerErrorを発生させる。このパスは、
get_clifford_gate_names()によって返されるリスト内のすべてのクリフォードゲート、すなわち をサポート["id", "x", "y", "z", "h", "s", "sdg", "sx", "sxdg", "cx", "cz", "cy", "swap", "iswap", "ecr", "dcx"]します。 サポートされているRZ回転の一覧は次の通りです["t", "tdg", "rz"](TゲートおよびTdgゲートは自動的にRZ回転に変換されます)。さらに、コン
LitinskiTransformationストラクタは引数fix_cliffordを受け取ります。 (デフォルトFalse以外の場合)、返される回路にはゲートPauliEvolutionGateのみが含まれ、最終のクリフォードゲートは省略される。 この場合、元の回路と合成回路の演算子は一般的に等価ではないことに注意してください。例:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import LitinskiTransformation from qiskit.quantum_info import Operator # The following quantum circuit consists of 5 Clifford gates # and two single-qubits RZ-rotation gates (note that Tdg is # an RZ-rotation). qc = QuantumCircuit(2) qc.cx(0, 1) qc.rz(0.1, 0) qc.cz(0, 1) qc.tdg(1) qc.h(1) qc.s(1) qc.cz(1, 0) # The transformed circuit consists of two PauliEvolution gates # and the same Clifford gates as in the original circuit. qct = LitinskiTransformation()(qc) # The circuits before and after the transformation are equivalent assert Operator(qc) == Operator(qct) -
オブジェクト
MCXGate用の新しいMCXSynthesisNoAuxHP24ハイレベル合成プラグインを追加しました。 さらに、オブジェクトMCXGateのデフォルト合成プラグインMCXSynthesisDefaultは、利用可能な補助量子ビットの数に応じて常に最適な合成方法を選択するように更新されました。 -
命令の角度制限を
Target指定するためのサポートを追加しました。 このリリース以前は、パラメータを取る操作が、有効な値をすべて許可するか、特定の値のみを許可するかを指定することがTargetできました。 例えば、対象に が追加RZGate(Parameter("theta"))された場合、それは θ の値RZGateがどのような値であっても が許容されることを示す。 ターゲットにifRZGate(math.pi)が追加された場合、それはターゲット上で許可される値が のみRZGateであることを示す。 この新機能により、許容角度を包含境界内の任意のfloat値に制限することが可能になります。 たとえば、にRZGate(math.pi)Targetを追加し、角度値を0から の値の範囲に制限することができます。ターゲットの角度境界を扱うには、いくつかの方法が利用可能です。 最初のものは
Target.add_instruction()、新しいangle_boundsキーワード引数を持つもので、これはの命令に角度制限を追加するためにTarget使用されます。 角度境界を扱うには、グローバルレジストリWRAP_ANGLE_REGISTRYにコールバック関数を登録する必要があります。この関数はトランスパイラに通知し、角度境界のWrapAnglesゲート調整方法を渡します。 コールバック関数は、回路からのゲート角度を表す任意floatの値のリストと、ゲートが作用した回路内の量子ビットインデックスを受け取り、その角度を持つゲートに対して等価な回路を表すオブジェクトDAGCircuitを返します。ただし、角度の境界やその他のTarget制約条件を遵守した形で返します。 例:import math from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target from qiskit.transpiler.passes.utils.wrap_angles import WRAP_ANGLE_REGISTRY target = Target(num_qubits=1) target.add_instruction(RZGate(Parameter("theta")), angle_bounds=[(-math.pi, math.pi)]) def callback(angles: List[float], qubits: List[int]) -> DAGCircuit: """Callback function to wrap RZ gate angles Args: angles: The list of floating point parameter values for the instance of RZGate in the circuit qubits: The physical qubit indices that this gate is operating on Returns: The DAGCircuit of the equivalent circuit""" angle = angles[0] dag = DAGCircuit() dag.add_qubits([Qubit()]) if angle > 0: divisor = math.pi else: divisor = -math.pi gate_counts = int(angles[0] // divisor) rem = angles[0] % divisor for _ in range(gate_counts): dag.apply_operation_back(RZGate(math.pi), [dag.qubits[0]], check=True) dag.apply_operation_back(rem, [dag.qubits[0]], check=True) WRAP_ANGLE_REGISTRY.add_wrapper("rz", callback)Target.has_angle_bounds()ターゲットに角度制限が設定されているかどうかを確認するために使用できます。Target.gate_has_angle_bounds()ターゲットの角度制限を回路内の任意のゲートに適用したい場合、この処理には
WrapAnglesトランスパイラパスを使用すべきです。 -
メソッド
Target.instruction_supported()に新しいcheck_angle_boundsキーワード引数を追加しました。 (デフォルトTrue値)に設定された場合、メソッドは指定された値が、照会対象の命令に対してparameters存在する可能性のある角度制限にも適合するかどうかを確認します。 -
新しいトランスパイラパスを追加しました
WrapAngles。これは、.Target内のゲートに対して角度制約を適用するために使用されます。 定義された角度境界Targetがある場合、このパスは回路内のゲートに関する全てのパラメータを解析し、ターゲットで指定された境界値との適合性を検証する。 例えば、ターゲットに角度制限を持つカスタムゲートが含まれている場合、パスはそのゲートを制限に適合するゲートに分解します:from qiskit.circuit import Gate, Parameter, QuantumCircuit, Qubit from qiskit.dagcircuit import DAGCircuit from qiskit.transpiler import Target, WrapAngleRegistry from qiskit.transpiler.passes import WrapAngles class MyCustomGate(Gate): def __init__(self, angle): super().__init__("my_custom", 1, [angle]) param = Parameter("a") circuit = QuantumCircuit(1) circuit.append(MyCustomGate(6.0), [0]) target = Target(num_qubits=1) target.add_instruction(MyCustomGate(param), angle_bounds=[(0, 0.5)]) def callback(angles, _qubits): angle = angles[0] if angle > 0: number_of_gates = angle / 0.5 else: number_of_gates = (6.28 - angle) / 0.5 dag = DAGCircuit() dag.add_qubits([Qubit()]) for _ in range(int(number_of_gates)): dag.apply_operation_back(MyCustomGate(0.5), [dag.qubits[0]]) return dag registry = WrapAngleRegistry() registry.add_wrapper("my_custom", callback) wrap_pass = WrapAngles(target, registry) res = wrap_pass(circuit) res.draw('mpl')
-
DAGCircuit現在は手動実装が用意されています__deepcopy__()。 これは、特に大規模な回路において、pickleプロトコルによる以前の暗黙的な実装よりも桁違いに高速です。 また、これはコンパイル性能にも直接的に寄与する。具体的には、最適化optimization_level=3レベル3で内部的に深部コピーを実行transpile()する場合、最適化ループの各反復において、DAGCircuitプリセットパスマネージャが返すオブジェクトgenerate_preset_pass_manager()を処理する際に、コンパイルoptimization時に直接的な恩恵をもたらす。 -
新たな手法が提供される。これは
DAGCircuit.make_physical()、量子ビットを標準的な物理量子ビットレジスタに効率的にDAGCircuit置換するものであり、拡張を含む可能性がある。 同様の方法も利用可能ですQuantumCircuit.ensure_physical()。 -
新しい方法、
DAGCircuit.structurally_equal()は、2DAGCircuitつのインスタンスが全く同じ順序で作成および変更された場合に、に利用できます。 これは==オーバーロードの標準的な意味的等価性チェックよりもはるかに強力なテストであり、トランスパイラ-パス作成者が自身の変更順序が決定論的であることを検証するために使用できます。 -
カスタムサブクラスは、初期プロパティを初期化するために、自身の
_passmanager_frontend()setInitialProperties()メソッド内でinitialProperties属property_set性を変更できるようになりましたBasePassManager。 これにより対称性が実現される。以前は最終プロパティを.中にのみ読み取ることが可能_passmanager_backend()であったためである。 -
最適
HighLevelSynthesis化パスにおける最適化基準を指定する新しいクラOptimizationMetricスを追加しました。 現在サポートされている2つのメトリクスは次のとおりです:COUNT_2Q2量子ビットゲートの数を最適化する。COUNT_TClifford+T基底集合に転置する際のTゲートの数を最適化します。
トランスパイラは基底ゲートセットに基づいて自動的にターゲットメトリックを選択します。例えば、クリフォード+T基底セットが検出された場合、それを
COUNT_T使用します。 ただし、このクラスは現在、transpile()実行時またはによって生成されたプリセットパスマネージャを実行generate_preset_pass_manager()時に手動で設定することはできません。 -
トランスパイラパ
HighLevelSynthesisスのコンストラクタにoptimization_metric、オブジェクトOptimizationMetricを受け取る新しい引数を追加しました。 に設定するとCOUNT_T、パスはクリフォード+Tゲートセットにより適した分解を選択する。 -
デフォルトの高レベル合成プラグインは
ModularAdderGate、Clifford+T基底セットへのトランスパイル時に優れたTカウントを生成しますMultiplierGate。 -
デフォルトの高レベル合成プラグインは、少なくとも1つの補助量子ビットが利用可能な場合に限り、Clifford+T基底セットへのトランスパイル時に優れたTカウントを生成する
MCXGate。 -
トランスパイラパス
InverseCancellation用にデフォルトの反転ゲートセットを追加しました。 以前は、パスオブジェクトのコンストラクタには、キャンセルするゲートまたはゲートペアの明示的なリストが必須引数として必要でした。 このリストはオプションであり、リストが提供されない場合、自己逆ゲートは以下の通りです:と逆ペア:
はパスによってキャンセルされる。
-
コン
InverseCancellationストラクタに新しい引数 を追加しました。run_defaultこの引数を に設定すると、カスタムゲートに加えて新しいTrueデフォルトの逆キャンセルゲートリストが実行されます。 これは、デフォルトのゲートに加えてカスタムの逆キャンセルセットを実行したいユースケースを想定しています。 -
TranspileLayout2つの新しいメソッド、from_property_set()write_into_property_set()と が追加されました。これらは、トランスパイルプロパティの現在のアドホックな構造と、それらが に変換される方法をTranspileLayout形式化します。 これにより、トランスパイラパイプライン内の各パスが、最終TranspileLayout的な構造化された形式となる値にアクセスし、それを完全に構造化された形で変更し、その後正規化された形式で書き戻すことが可能になります。将来のQiskitバージョン 3.0 では、(またはそれに類似
TranspileLayoutしたもの)がトランスパイラDAGCircuit中間表現の直接属性となり、他の部分と同期を保つために各パスで保持DAGCircuitが要求される見込みである。 -
ステージ
optimizationにおいて、関数transpile()と関数generate_preset_pass_manager()によって返される生成済みパス管理オブジェクトを用いてoptimization_level=3、実行中のVF2PostLayoutトランスパイラパスを再有効化します。 このパスは、ステージで実行された全ての物理最適化の後strict_direction=True、最終的な出力回路を用いてレイアウトを改善しようとする試みとして実行される。 これは以前Qiskitで有効化されていました( v2.1.0 )。しかし、初期実装の問題により、 2.1.2 で元に戻されました。 これらの問題は修正済みであり、より良いレイアウトが見つかった場合には適切に適用されます。
可視化機能
-
回路描画ツール
qiskit.visualization.circuit_drawer()および 向けに、measure_arrowsおよびtext``mplバックエンドにqiskit.circuit.QuantumCircuit.draw()新しいオプション が追加されました。 このオプションが に設定されているTrue場合、ドロワーは ボックスmeasureから下部の古典ビット群へ矢印を描画します。 これが以前の引き出しの動作でした。 に設定されている場合、False矢印は描画されず、代わりに で使用されている古典的なレジスタとビットが ボックスmeasure内にmeasure示されます。 これにより、ボックスを垂直レイヤー内にmeasure積み重ねることが可能になります。オプションが設定されていない場合、デフォルトは
True。 ユーザーは、デフォルトでは~/.qiskitディレクトリにあるユーザー設定ファイルのファイルsettings.confでデフォルトを変更できる。[Default]の見出しの下で、ユーザーはデフォルトを変更するためにcircuit_measure_arrows = Falseを入力することができる。
アップグレードの注意
- Qiskitをソースからビルドする(スタンドアロンモードでC APIをビルドすることを含む)ための最小サポートRustバージョンが、Rust 1.79 から Rust 1.85 に引き上げられました。 この変更は、Qiskit内部で使用されているRust線形代数ライブラリ faerの新しいバージョンを使用できるようにするために必要でした。 旧バージョンのfaerを使用してWindows上でQiskitを実行すると、問題が確認されました。 これらは新しいリリースで修正されたが、新しいバージョンのfaerをビルドするには新しいバージョンのRustコンパイラが必要である。
回路アップグレードに関する注意事項
-
の回路定義が、を使用するように
ModularAdderGateアップグレードadder_modular_v17()されました。 以前の動作を得るには、代わりにadder_qft_d00()の定義を使用してください。 -
メソッド
XGate.control(),CXGate.control(),CCXGate.control(),C3XGate.control()C4XGate.control(),, および は、引数annotatedが に設定されたMCXGate.control()場合True、もはやAnnotatedOperationを返さず、代わりに が の場合annotatedに得られるのMCXGateと同じFalse明示的な を返します。 これは、標準回路ライブラリ全体で引数がannotated使用される方法と一致しています。そこでは、ネイティブのゲートクラスが既に利用可能な場合、一般的にAnnotatedOperation``の導入を避けています。 実際には、これによりMCXファミリにおける制御注釈付きゲートの分解がより効率的になる。
C API アップグレードに関する注意事項
-
uintptr_tのほとんどの用法はsize_tに変更された。 具体的には、以下の用法が変更された:QkOpCount.countQkOpCounts.lenQkObsTerm.len- .
qk_circuit_num_instructions()の戻り値の型 - .
qk_circuit_get_instruction()における議論index - .
qk_obs_new()における議論boundaries - 、
qk_obs_len()、および の戻りqk_obs_boundaries()値qk_obs_num_terms()の型。 - の戻り値
qk_target_entry_num_properties()の型、およびqk_target_num_instructions()。
この変更が必要だったのは、QiskitのRustコードからCヘッダーファイルを生成するために使用されていたツール、 cbindgenが、
size_tがRustの型用法により正確に一致する箇所で、デフォルトでuintptr_tを使用していたからです。 この変更は、C APIにおける値の使用目的をより明確にするために行われた。
QPY アップグレードに関する注意事項
- によって発行されるQPYのデフォルトバージョンは
qpy.dump()、現在QPYフォーマットバージョン16です。 異なるフォーマットバージョンが必要な場合は、引数versionを使用して以前のフォーマットバージョンを指定できます。
量子情報アップグレードに関する注意事項
SparsePauliOp.assign_parameters()すべてのパラメータが数値に完全に束縛されている場合、出力coeffs配列のcomplexデータ型をに設定します。
合成アップグレードに関する注意事項
- 引数
opt_a1およびopt_a2のデフォルト値は、現在opt_a1 = Noneqs_decomposition()および ですopt_a2 = None。 新しいデフォルト設定では、引mat数の入力ユニタリーが制御されているか否かに基づき最適な値を選択し、デフォルトで最小のCXGateカウントを実現します。 以前の動作が必要な場合は、明示的に およびopt_a2 = Trueopt_a1 = Trueを呼び出すことで、以前のリリースと同じ動作を維持できます。
トランスパイラ アップグレード ノート
- 回路は
PassManager現在、個々のパスの実行開始前に常にnum_input_qubitsプロパティoriginal_circuit_indicesとを設定する。 これらは入力回路の特性であり、従来は個々のパスが設定するものであった。多くの場合、その主要な目的の副次的な効果として設定されていた。
回路の廃止予定
-
回路ライブラリの以下のクラスは、Qiskit 2.2 の時点で非推奨となっており、Qiskit 3.0 で削除される予定です。 現代のゲートと同等のものに交換された。
バグ修正
-
ApplyLayoutゼロ量子ビットを適用するケースを正しくLayout処理するようになります。 以前は、の"layout"フィールドPropertySetがに等しい場合でも、レイアウトが設定Layout()されていないと主張していました。 -
インスタンス
QkOpCountsの作成時および空のインスタンスが渡される際の呼び出し時にqk_opcounts_clear()発生するメモリリークの問題を修正しました。 -
以前は、演算
PauliEvolutionGate子のリストから無効なものを定義することができた。その演算子は、すべて同じ数の量子ビットに対して定義されているわけではなかった。 この問題は修正され、ゲートが定義された際にエラーを発生させるようになりました:from qiskit.quantum_info import Pauli, SparsePauliOp from qiskit.circuit.library import PauliEvolutionGate pauli = Pauli("XYZ") # 3 qubits op = SparsePauliOp(["XYIZ"], [1]) # 4 qubits evo = PauliEvolutionGate([pauli, op], time=1) -
トランスパイラ・パス
VF2Layoutにおける問題を修正しました。固定シードが設定されている場合でも、パスの出力が非決定論的になる可能性がありました。具体的には、入力回路に単一量子ビット操作のみを含むアクティブな量子ビットが存在する場合に発生していました。 修正済み #14729 -
複数の回路で実行した際に関
callback数が呼び出されないバグを修正しましたPassManager.run()。 各回路の全パスにおいて、並列実行時も含め、コールバックが正しくトリガーされるようになりました。 -
トランスパイラパス
CommutativeInverseCancellationにおける複数の問題を修正しました。 このパスは現在、演算、制御フロー操作、およびClifford非可逆操作(例Initialize:)を含む回路で正しく動作します。さらに、パスは逆ゲート・ペアを識別する際、常に最初に(マトリックス・ベースでない)構文チェックを行うようになった。 ゲートが構文的に等しくなく、引数
matrix_basedがTrueに設定され、操作がmax_qubitsを超える量子ビットに作用しない場合、行列ベースのチェックも実行される。 これにより、峠の削減ポテンシャルが若干向上する。 -
トランスパイラパス
CommutativeCancellation(およびそれによりtranspile())における複数の問題を修正しました。回路のグローバルフェーズが正しく更新されていませんでした。 特に、XゲートとRXゲートを結合すると位相不一致が生じた一方、 、 という形式の角度を持つパウリ回転ゲートを除去すると、誤って という位相シフトが生成された。 -
標準制御ゲートが全1状態以外の状態で制御された場合に正しく処理されない問題を修正しました
CommutationChecker。 修正済み #14974 -
. における非決定性を修正
CommutativeCancellationしました。 これは、ノード順序の決定性が重要な場合に通常使用されるべきである、topological_op_nodes()またはDAGCircuit.topological_nodes()が返す順序には影響しなかった。これは、それらの組み込みの正規化ソート関数によるものである。 ただし、ノードを任意の順序(DAGCircuit.op_nodes())で検査する場合や辺構造(DAGCircuit.edges())を検査する場合、の呼び出し後は反復順序がCommutativeCancellation決定論的ではなくなる。 -
オープン制御のMCXゲートに制御を追加する
MCXGate際MCXGate.control()、制御対象のMCXゲートのctrl_state状態を考慮していなかったバグを修正しました。これにより、拡張されたMCXゲートのctrl_state状態が正しく反映されない問題が発生していました。 明示的なMCXクラスCXGate,CCXGate,C3XGate, およびC4XGateは既に正しく処理されていたことに注意してください。 -
Qiskit をインポートする際、 Python 3.9 の非推奨警告がユーザーコードに起因するものとして正しく識別されるように修正。 以前は、ユーザーコードが原因であることが識別されず、 Python のデフォルトの警告フィルターがユーザーに警告を表示しないことを意味した。
-
dimacsファイルからの読み込みを試みた際に発生していた
BitFlipOracleGateエラーを修正しましたTypeError。PhaseOraclePhaseOracleGate -
トランスパイラ・パス
ElidePermutationsにおけるバグを修正しました。sPermutationGateが存在する場合に量子ビットのマッピングが正しく更新されず、誤った回路が生成され、パス管理者のプロパティセットが更新される問題が発生していました。 -
プロパティ
final_layoutを設定する組み込みトランスパイラは、このフィールドが既に設定されていた場合、その更新を正しく処理するようになりました。 これは、メソッドが をセットする複数回のパスTranspileLayout.routing_permutationを実行した後、正しいfinal_layout順列を返すようになることで観察できる。これは、Qiskitの組み込みプラグインを使用した通常の呼び出しには影響しません。この
generate_preset_pass_manager()形式で構築されたパイプラインは、transpile()をfinal_layout複数回設定しようとすることはありません。 -
回路
HighLevelSynthesisに古典レジスタを持つ高レベルオブジェクトが含まれている場合、それらが外側の回路における対応するインデックスではなく、オブジェクト内の相対インデックスにマッピングされるというバグを修正しました。 古典レジスタは、外部回路インデックスに正しくマッピングされるようになりました。 -
既存の命令と一致する引数
parametersとoperation_nameでメソッドが呼び出された場合Target.instruction_supported()、命令の量子ビット順序のチェックがスキップされるバグを修正しました。 -
引数
max_trialsが `` または負の数VF2LayoutNoneに設定された場合の動作を修正しました。 パスは、オプションが設定されている場合、検索を回路またはターゲットのサイズに基づくものに制限すると記録されており、無制限の検索を指定するために負の値を受け入れるとNone記録されていた。 しかし、 2.1.0 ではこの動作が誤って変更され、無制限の検索を実行Noneするようになり、負の数を使用しようとするとエラーが発生するようになりました。 これらの見落としは修正され、パスは文書通り動作し、以前のリリースと一貫性を保つようになりました。 -
高レベル合成プラグインにおける問題を修正しました。
MCXGateMCXSynthesis2DirtyKG24MCXSynthesis1DirtyKG24具体的には、利用可能なクリーン補助量子ビットを、利用可能なダーティ補助量子ビットとして考慮していなかった不具合を修正しました。 特に、クリーンな補助量子ビットとダーティな補助量子ビットが1つずつ利用可能な場合、このプラグインは適用MCXSynthesis2DirtyKG24されなかった。 -
この
PauliEvolutionGate.to_matrix()メソッドは現在、正確な行列指数関数 を返します。ここで はゲートtimeに渡された入力operatorです。 これは予期せぬ動作を修正します。なぜなら、PauliEvolutionGate* は正確な*時間発展を表すと文書化されているにもかかわらず、以前は行列がコンパイラによる時間発展の近似方法に依存していたためです。 このto_matrixメソッドは、ドキュメントと整合性が取れています。 -
多数のサブ式を結合して段階的にビルド
ParameterExpressionする際に発生していたパフォーマンスの低下を修正しました。 修正済み #14653 -
ps'単位を使用した遅延命令のある回路を QASM3 にエクスポートする際の正しさのバグを修正。
-
回路
QFTの表示におけるエッジケースを修正しました。 以前、がQFT.inverse()呼び出され、その後QFT回路の属性が変更されると、QFTはとして表示されました"IQFT_dg"。 これは誤りであり、現在は正しく表示されています"IQFT"。 #14758 を修正しました。 -
プラグ
PauliEvolutionSynthesisRustiqインのバグを修正しました。このバグは、演算SparseObservable子の操作対象に型 のオブジェクトPauliEvolutionGateが含まれる場合に、誤った回路を生成するものでした。例:
from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparseObservable, Operator from qiskit.transpiler.passes.synthesis.hls_plugins import PauliEvolutionSynthesisRustiq obs = SparseObservable.from_sparse_list([("1+XY", (0, 1, 2, 3), 1.5)], num_qubits=4) evo = PauliEvolutionGate(obs, 1) qct = PauliEvolutionSynthesisRustiq().run(evo) assert Operator(qct) == Operator(evo) -
関数
generate_preset_pass_manager()において、引backend数が設定されていない場合に提供Targetされたオブジェクトに含まれるタイミング制約データを誤って無視する問題を修正しました。 修正済み #14329 -
ObservablesArray.coerce_observable()で、observable がエルミートでないという例外が過剰にトリガーされるバグを修正。zeroに等しいオブザーバブルは許可されず、グレースフル・フェイルを引き起こすようになった。 -
qiskit.circuit.library.quantum_volume()そのseed引数として を入力としてnumpy.random.Generator扱うように更新されました。 以前は、このようなジェネレータ引数は.TypeErrorを結果として生み出していました。 -
QuantumCircuit.compose()引var_remap数が指定された場合、命令Delayで使用される変数と区間を正しく再マッピングします。 -
SabreLayout「高密度部分集合」レイアウトを試験的な手法の一つとして採用し、と同じアルゴリズムDenseLayoutに従う。 しかし従来、Sabreが使用していたバージョンでは、ダミー補助量子ビットを含む全ての仮想量子ビットが物理量子ビットに割り当てられており、アルゴリズムの有効性は損なわれていたものの、その正しさは損なわれていなかった。 Sabreは今回の初期試験において、ユーザーが定義した仮想量子ビットのみを使用します。これにより、大規模な回路クラス全体で平均化した場合、レイアウト選択においてわずかな改善が得られる可能性があります。 -
重複を結合する前に、係数の絶対値に基づいてパウリ項を除去する
SparsePauliOp.simplify()メソッドのバグを修正しました。 これにより、2つの重要なエッジケースで不正な動作が発生しました:- 複数の同一のパウリ項が、個々には単純化しきい値以下であるが、その合計がしきい値を超える小さな係数を持つ場合、それらの項は誤って削除された。
- 複数の同じパウリ項の係数がしきい値を超えているが、和がゼロに近い場合、それらは誤って保持された。
詳細は #14194を参照。
-
TranspileLayout.initial_index_layout()仮想量子ビットがコンストラクタでインデックス順にinitial_layout指定されていない場合、引filter_ancillas=True数を正しく処理するようになりました。 -
VF2Layoutそして、完全にアイドル状態の量子ビットに対する(VF2PostLayout任意の)レイアウト割り当てを正しく含めるようになります。 以前は、コンパイル後に呼び出しがTranspileLayout.initial_index_layout()失敗することでこれが観察された可能性がある。 -
トランスパイラパス
VF2PostLayoutにおける問題を修正しました。 特定の状況において、引数と共にパスが実行される際、回路の相互作用グラフに1量子ビット操作のみを持つ量子strict_direction=Trueビットが含まれている場合、潜在的な実行時間のスケーリング問題が発生する可能性がありました。 これらのマッピング問題は、スコアリングに組み合わせ的複雑さを生じさせ、パスがほぼ常にスコアリングタイムアウトに到達し、レイアウトの改善が通常見られない結果を招く。 モードstrict_direction=Falseではこれらの問題に対して最適化された探索アルゴリズムが実装されているが、追加の制約条件によりこの手法はstrict_direction=True適用不可能となる。 代わりに、これらのケースでは、レイアウト問題がパスに対して実行VF2PostLayout可能でないため、検索をスキップします。
その他の注意事項
- サブレ・ルーティングの実装
SabreLayoutでは、SabreSwap現在、内部仮想相互作用表現において、同時にルーティング対象となるノードの連続を圧縮する。 これによりルーティングの効率が向上し、中間メモリの使用が削減され、 2qlookaheadゲートの連続配置によるヒューリスティック構成要素へのバイアスが回避される。
2.1.0rc1
非推奨のメモ
-
Python 3.9 で Qiskit を実行するためのサポートは非推奨となり、Qiskit 2.3.0 リリースで削除される予定です。 2.3.0 は、 Python 3.9 がサポート終了となった後の最初のリリースである。 [1] これは、 2.3.0 リリースから、使用している Python バージョンを Python 3.9 以上にアップグレードする必要があることを意味します。