Qiskit SDK 1.1 リリースノート
1.1.2
前奏曲
Qiskit 1.1.2 は 1.1 シリーズのマイナーバグフィックスリリースです。
バグ修正
-
のバグを修正しました。
BitArray.from_counts()そしてBitArray.from_samples(). 以前は、ゼロだけを含むデータが与えられ、オプションの引数num_bitsの値がない場合、エラーが発生した。 を生産している。BitArrayでBitArray.num_bitsを1に設定した。 -
のデコレーターが欠落していたのを修正した。
C3SXGateがGate.to_matrix()が呼ばれた場合に失敗していたのを修正した。 ゲートマトリックスは期待通りに戻ってきた。 -
トランスパイラー・パスに
CollectCliffordsを追加した。 特に、ゲートを追加した。ECRGate,DCXGateiSWAPGate、SXGateとSXdgGateを追加した。 -
属性を使用する場合
QuantumCircuit.parameters属性は、パラメトリック回路でQuantumCircuit.copy_empty_like()を使用した場合、属性は正しく空になります。 以前は、内部キャッシュは無効化されることなくコピーされていた。 修正 #12617。 -
を修正しました。
SolovayKitaev既存の.npyファイルから基本近似値を読み込む際のトランスパイラ・パスを修正。 以前は、(ゲートのキャンセルなどによる)さらなる削減を可能にする保存された近似値をロードすると、実行時に失敗することがあった。 さらに、U(2)ゲート積とSO(3)表現の大域的な位相差は、保存-再読み込み手順の間に失われた。 修正 Qiskit/qiskit#12576. -
の問題を修正しました。
dag_drawer()とDAGCircuit.draw()の問題を修正しました。DAGCircuitインスタンスにVarを含むインスタンスを視覚化しようとしたときの問題を修正した。 ビジュアライザーはこれを実行しようとすると例外を発生させるが、これは修正され、期待通りのビジュアライゼーションが生成されるようになった。 -
コンストラクター
GenericBackendV2は、バックエンドのサイズから割り当てることができない基底ゲートを受け入れていたため、以前は不正なバックエンドを構築することができた。 例えば、1量子ビットを持つバックエンドは、以前は2量子ビットのゲートを持つ基底を受け入れることができた。 -
OpenQASM 2パーサー(
qiskit.qasm2) は、64 ビット整数に収まらない整数の条件式を扱えるようになった。 #12773 を修正。 -
以前は
DAGCircuit.replace_block_with_op()をn-qubitの操作でmqubitのブロックに置くことができ、DAGは無効な状態のままであった。 この動作は修正され、これを実行しようとすると期待どおりにDAGCircuitErrorが発生するようになった。
1.1.1
前奏曲
Qiskit 1.1.1 は 1.1 シリーズのマイナーバグフィックスリリースです。
バグ修正
-
のバグを修正。
Isometryのバグを修正した。UnitaryGate.control()のエラーにつながるバグを修正した。UnitaryGateが2つ以上あった場合にエラーになるバグを修正。 -
QuantumCircuit.depth()のようなオペランドを持たない演算も正しく処理できるようになりました。GlobalPhaseGate. -
QuantumCircuit.depth()は、深度計算の一部として、リアルタイム式で使用される変数とclbitsをカウントするようになった。 -
引数でdraw関数が呼び出されたときにパルススケジュールを描画しない
qiskit.visualization.pulse_v2.interface.draw()のバグを修正。BackendV2引数で呼び出された場合にパルススケジュールを描画しないバグを修正しました。 V2 バックエンドはハードウェア・チャンネルの周波数を報告しないため、生成された図面は「no freq」と表示される 各チャンネルのラベルの下。 -
この
VF2Layoutを渡すと例外が発生する。Targetを渡すと例外が発生する。 これはAer 0.13 からのターゲットの場合である。 この問題は解決されました。 -
ParameterExpressionが更新され、 Python の組み込み数値型のインスタンス(floatやintなど)と比較する完全束縛インスタンスも、他のインスタンスと一致するハッシュ値を持つようになった。 この変更により、これらの型が辞書のキーとして互換性を持って使用できるようになった。 12488を参照。 -
インポートされた OpenQASM 2プログラムのカスタム・ゲート(
gateステートメントに由来するもの)には、実装が追加された。Gate.to_matrix()実装を持つ。 以前は行列の定義がなかったため、 OpenQASM 2 を経由するラウンドトリップは、ゲート行列を導き出す能力を不必要に失う可能性があった。 ただし、この行列は、内部ゲート定義の行列を再帰的に求めることによって計算される。Operatorと同じように、行列は内部ゲート定義の行列を再帰的に求めることによって計算される。 -
Target.has_calibration()が更新され、命令プロパティにNone、ターゲットに追加された命令に対して例外を発生させないようになった。 #12525 を修正。
1.1.0
前奏曲
Qiskit 1.1.0 リリースは、無数の新機能とバグ修正を含むマイナー機能リリースです。 今回のリリースのハイライトは以下の通り:
型付き古典変数のサポートがQiskitの
QuantumCircuit. これらの古典変数は、入力として指定することも、スコープ変数として指定することもできます。QuantumCircuitにスコープされた変数として指定することができます。 ゲート・パラメーターや出力変数の設定などのサポートは、将来的に追加される予定である。パスでトランスパイラが内部的に使用するデフォルトの2つの量子ビット合成メソッドは、Rustで再実装されました。
UnitarySynthesisパスでトランスパイラが内部的に使用するデフォルトの2つの量子ビット合成メソッドがRustで再実装されました。 これにより、2量子ビットのユニタリー行列を分解する際の実行速度が大幅に向上する。 その結果、最適化レベル3によるトランスパイルの実行時間が大幅に改善された。UnitarySynthesisを実行すると、従来は大きな実行時間オーバーヘッドが発生していました。 このリリースでは、最適化レベル2の最適化段階の一部としてUnitarySynthesisを最適化レベル2の最適化ステージの一部として実行するようになりました。さらに
Isometryで使用されていた数値計算手法がRustに移行され、特に制御されたユニタリーゲート合成の実行速度が大幅に向上した。 マルチコントロールの分解XGateとPhaseGateの分解が改善され、合成に使用するゲート数が2桁以上減少しました。Qiskitには新しいトランスパイラ・パスが多数導入されており、多くの場合、トランスパイルされた量子回路のサイズを縮小しつつ、大幅な実行速度の向上を実現している。 具体的には
ElidePermutationsとStarPreRoutingは、ルーティングの出力品質と実行時間に大きな影響を与えることが実証されている。RemoveFinalResetリセットを含む量子回路を改善することができる。デフォルトのパス・マネージャーは、新しく導入されたトランスパイラー・パスで拡張され、改善された。 特に、
generate_preset_pass_managerから提供され、内部的にtranspile()によって内部的に使用されている最適化レベル2のプリセット・パス・マネージャーは、将来のリリースでデフォルトのパス・マネージャーとして機能するように、実行時間と最適化努力のトレードオフがより良くなるようにリファクタリングされました。 このリリースでは、レベル2を使用するデフォルトは変更されていないが、通常、レベル1や3を使用するよりも良い選択である。新しいジェネリック・プリミティブ V2 の実装が追加された、
BackendEstimatorV2とBackendSamplerV2既存の完全なステートベクタベースの実装を補完する。プラットフォームサポートの変更: Python 3.8 は Qiskit 1.1.0 から非推奨となり、 1.3.0 ではサポートされなくなりました。 arm64 macOS はティア1サポートに昇格しました。
回路の特徴
-
メソッド
QuantumCircuit.power(),Gate.power()のサブクラスのサブクラス(例えばGate(のサブクラスの同様のメソッド(たとえばSGateなど)のサブクラス上の同様のメソッドはすべて、新しい引数annotated。AnnotatedOperationオブジェクトを返すために使用されます。 デフォルト値のFalseは、既存の動作に対応する。 さらに、powerメソッドが明示的に定義されている標準ゲートでは、引数annotatedは何の効果もない。 例えば、SGate().power(1.5, annotated=False)とSGate().power(1.5, annotated=True)はどちらもPhaseGateを返す。 明示的に定義されたパワーメソッドがないゲートでは、annotatedの値に違いが現れる。False。UnitaryGateを返します。一方、Trueの値は、「パワー修飾子」で変更された命令を表すAnnotatedOperationを返す。 -
に新しい引数
ctrl_stateを追加。QuantumCircuit.mcp()そしてMCPhaseGate.その
QuantumCircuit.mcp()メソッドとMCPhaseGateクラスが更新され、ctrl_stateパラメータが追加されました。 この機能強化により、ユーザーはマルチ制御位相ゲートの制御状態を指定できるようになりました。 このパラメータには整数値かビット列を指定することができ、指定がない場合はデフォルトで「1」の状態を制御する。from qiskit import QuantumCircuit qc = QuantumCircuit(4) qc.mcp(0.2,[0,1,2],3,ctrl_state=2) -
に新しい引数
ctrl_stateを追加した。QuantumCircuit.mcx().量子回路ライブラリの
QuantumCircuit.mcx()量子回路ライブラリのメソッドにctrl_stateパラメータが追加され、マルチ制御Xゲートの制御状態を指定できるようになった。 このパラメータには、10進数値またはビット列を指定することができ、指定しない場合はデフォルトで「1」の状態を制御する。from qiskit import QuantumCircuit qc = QuantumCircuit(3, 3) qc.mcx([0, 1], 2, ctrl_state="00") -
A
QuantumCircuitは型付き古典変数を含むことができるようになった:from qiskit.circuit import QuantumCircuit, ClassicalRegister, QuantumRegister from qiskit.circuit.classical import expr, types qr = QuantumRegister(2, "q") cr = ClassicalRegister(2, "c") qc = QuantumCircuit(qr, cr) # Add two input variables to the circuit with different types. a = qc.add_input("a", types.Bool()) mask = qc.add_input("mask", types.Uint(2)) # Test whether the input variable was true at runtime. with qc.if_test(a) as else_: qc.x(0) with else_: qc.h(0) qc.cx(0, 1) qc.measure(qr, cr) # Add a typed variable manually, initialized to the same value as the classical register. b = qc.add_var("b", expr.lift(cr)) qc.reset([0, 1]) qc.h(0) qc.cx(0, 1) qc.measure(qr, cr) # Store some calculated value into the `b` variable. qc.store(b, expr.bit_and(b, cr)) # Test whether we had equality, up to a mask. with qc.if_test(expr.equal(expr.bit_and(b, mask), mask)): qc.x(0)これらの変数は、回路の入力として指定することも、スコープ変数として指定することもできる。 回路オブジェクトは、型付けされた古典変数出力を表現するためのサポートをまだ持っていないが、これは、ハードウェアと結果のインターフェイスがよりサポートしやすい状態になったときに、後で追加される予定である。 内側スコープのブロックを表す回路は、外側スコープの変数を取り込むこともできる。
変数は
Varノードで、任意の型を含むことができるようになり、回路に追加されると、そのライブ範囲内で一意のメモリ位置を表します。 これらの回路はQuantumCircuit.add_var()とQuantumCircuit.add_input()を使うか、Var.new()を使って低レベルで構築することができる。変数は、手動で
Store命令とそれに対応する回路メソッドQuantumCircuit.store(). への書き込みも含まれる。ClbitとClassicalRegisterインスタンスへの書き込みも含まれます。Varノードへの書き込みも含まれます。変数は、古典的な式 (
qiskit.circuit.classical.exprを参照)が有効なところならどこでも使える。 現在のところ、これはコントロール・フロー操作の対象となる表現であるが、将来的には型と表現システムの拡張に伴い、これをゲート・パラメーターに拡大する予定である。これらの変数と関連するデータモデルについては、 リアルタイム・クラシック計算を参照のこと。
これらは、QPYシリアライズ(
qiskit.qpy)、 OpenQASM 3エクスポート(qiskit.qasm3)、回路ビジュアライザ(QuantumCircuit.draw()).注新しい古典的な変数とストレージは、ハードウェアやシミュレーターのバックエンドでサポートされるようになるまで、しばらく時間がかかるだろう。 プリミティブ・インターフェイス(
qiskit.primitives)ではサポートされていないが、それらのインターフェイスが進化するにつれて、それらのインターフェイスに情報を提供することになるだろう。 -
従来のリアルタイム式モジュール
qiskit.circuit.classicalは、符号なし整数やビットライクのインデックス付けやビットシフトを表現できるようになった(例えばClassicalRegister). 例えば、あるレジスタと別のレジスタのビットシフトを比較することが可能になった:from qiskit.circuit import QuantumCircuit, ClassicalRegister from qiskit.circuit.classical import expr cr1 = ClassicalRegister(4, "cr1") cr2 = ClassicalRegister(4, "cr2") qc = QuantumCircuit(cr1, cr2) with qc.if_test(expr.equal(cr1, expr.shift_left(cr2, 2))): passQiskitは、レジスタに動的にインデックスを付ける条件も表現できる:
with qc.if_test(expr.index(cr1, cr2)): pass -
の構築性能は
NLocalおよびその派生回路ライブラリ・サブクラス(例えばEfficientSU2とRealAmplitudes)は、回転および/またはもつれサブブロックが単一のQiskit標準ライブラリゲートの単純なアプリケーションである場合、大幅に改善されました。 これらの回路は遅延的に構築されるため、クラスのインスタンス化ですぐに改善が見られるわけではなく、その内部構造への最初のアクセスで改善が見られるかもしれない。 パフォーマンス向上は10倍速のオーダーだ。 -
QuantumCircuit.append()このキーワード引数にはcopyがあり、デフォルトはTrueである。 ランタイム・パラメータ(ParameterExpression)を持つ命令が回路に追加される場合、デフォルトでは、回路は常に命令のコピーを作成します。QuantumCircuit.assign_parameters()を変更しようとしても、同じ命令への他の参照には影響しません。 現在、copy=Falseを設定することで、これを上書きすることができます。そのため、あなたの指示が他の場所で使用されないことが分かっている場合は、コピーペナルティを回避することができます。 -
QuantumCircuit.compose()このキーワード引数にはcopyがあり、デフォルトはTrueである。 デフォルトではcompose()はすべての命令をコピーするので、ある回路の突然変異が他の回路に影響することはない。copy=Falseの場合、もう一方の回路からの命令は、新しい回路が直接所有することになる。 この場合、他の回路はその後使用してはならない。 -
回路の構築時間は
QuantumVolume回路の構築時間は大幅に改善され、 10x またはそれ以上のオーダーとなった。 内部 SU4 ゲートも、生成時により多くのビットのランダム性を使用するようになり、特に幅と深さが大きい場合に、より代表的なボリューム回路につながる。 -
QuantumVolumeは、flattenキーワード引数を持つようになった。Falseこの場合、構築された回路には1つの命令が含まれ、その命令には実際のボリューム構造が含まれる。Trueに設定すると、回路は直接、体積の SU4 行列を持つことになる。 -
UnitaryGateオプションでnum_qubits。 この唯一の効果は、量子ビット数の推論をスキップすることであり、これは多くのゲートを構築する場合にパフォーマンス上有用である。 -
QuantumCircuitには、マニュアルの変数を扱ったり検査したりするための新しいメソッドがいくつかある。Var変数を使用します。これらすべての詳細については、「 リアルタイムのタイプされたクラシック・データを扱う 」を参照のこと。
新しい方法とは
add_var()add_input()add_capture()add_uninitialized_var()get_var()has_var()iter_vars()iter_declared_vars()iter_captured_vars()iter_input_vars()store()
さらに、これらの変数を取り囲むいくつかの新しい動的属性がある。
QuantumCircuitがある: -
ControlFlowOpとそのサブクラスはiter_captured_vars()メソッドを持つようになりました。このメソッドは、その直前のブロックに取り込まれた一意な変数に対するイテレータを返します。 -
DAGCircuitには、マニュアルの変数を扱ったり検査したりするための新しいメソッドがいくつかある。Var変数を使用します。 これらはほぼ同等である。QuantumCircuitただしDAGCircuitメソッドはよりインタラクティブな人間の使用に特化している。QuantumCircuitメソッドはよりインタラクティブな人間の使用に特化している。新しい方法とは
add_input_var()add_captured_var()add_declared_var()has_var()iter_vars()iter_declared_vars()iter_captured_vars()iter_input_vars()
新しいパブリック属性もある:
-
DAGCircuit.wiresも含まれるようになった。Varこれらも古典的なデータ・フローであるためだ。 -
新しいメソッド、
Var.new()が追加され、そのメモリを所有する古典的なリアルタイム変数を手動で構築できるようになった。 -
QuantumCircuit.compose()リアルタイム・クラシカル変数をよりよくサポートするために、var_remapとinline_capturesの2つのキーワード引数が必要である。var_remapはVarノードを書き換えることができる。 これは名前の衝突を避けるために使うことができる。inline_capturesをTrue(デフォルトはFalse)に設定することができる。Varに設定すると、変数を再宣言することなく、引数回路で "キャプチャ "として追跡されたすべてのノードをベース回路で同じノードにリンクします。Varにリンクさせることができる。 これはQuantumCircuit.copy_empty_like()のvars_mode="captures"の処理と組み合わせることで、変数を含む回路をレイヤーごとに構築することができる。 -
DAGCircuit.compose()には新しいキーワード引数、inline_capturesがある。Trueに設定することで、引数回路上の「キャプチャされた」ノードを、再宣言することなくベース回路上にインライン化することができる。Varノードを再宣言することなく、ベース回路上にインライン化することができる。vars_mode="captures"いくつかのDAGCircuitオプションと併用することで、同じ変数を操作するDAGを結合することができます。 -
QuantumCircuit.copy_empty_like()そしてDAGCircuit.copy_empty_like()には新しいキーワード引数vars_mode。Varノードの追跡方法を制御する。 デフォルト ("alike") では、変数はソースと同じ入力/キャプチャ/ローカル・モードで宣言される。 すべての変数をキャプチャに変換する場合は"captures"を設定し(これはcompose()で便利)、あるいは"drop"に設定すると、変数を削除することができます。 -
新しい
vars_modeキーワード引数がDAGCircuitメソッドに追加されました:と同じ意味を持つ。
copy_empty_like(). -
回路ライブラリ(
qiskit.circuit.library)にあるすべての "標準ゲート "を文字列名で指定できるようになった。TwoLocal回路RealAmplitudesそしてEfficientSU2.
プリミティブ機能
-
を実施した。
BackendEstimatorV2のBaseEstimatorV2が追加された。 この推定器はBackendV1そしてBackendV2.import numpy as np from qiskit import transpile from qiskit.circuit.library import IQP from qiskit.primitives import BackendEstimatorV2 from qiskit.providers.fake_provider import Fake7QPulseV1 from qiskit.quantum_info import SparsePauliOp, random_hermitian backend = Fake7QPulseV1() estimator = BackendEstimatorV2(backend=backend) n_qubits = 5 mat = np.real(random_hermitian(n_qubits, seed=1234)) circuit = IQP(mat) observable = SparsePauliOp("Z" * n_qubits) isa_circuit = transpile(circuit, backend=backend, optimization_level=1) isa_observable = observable.apply_layout(isa_circuit.layout) job = estimator.run([(isa_circuit, isa_observable)], precision=0.01) result = job.result() print(f"> Expectation value: {result[0].data.evs}") print(f"> Standard error: {result[0].data.stds}") print(f"> Metadata: {result[0].metadata}") -
を実施した。
BackendSamplerV2のBaseSamplerV2が追加された。 このサンプラーはBackendV1とBackendV2をサポートしており、memoryオプションでビット列を計算できる。import numpy as np from qiskit import transpile from qiskit.circuit.library import IQP from qiskit.primitives import BackendSamplerV2 from qiskit.providers.fake_provider import Fake7QPulseV1 from qiskit.quantum_info import random_hermitian backend = Fake7QPulseV1() sampler = BackendSamplerV2(backend=backend) n_qubits = 5 mat = np.real(random_hermitian(n_qubits, seed=1234)) circuit = IQP(mat) circuit.measure_all() isa_circuit = transpile(circuit, backend=backend, optimization_level=1) job = sampler.run([isa_circuit], shots=100) result = job.result() print(f"> bitstrings: {result[0].data.meas.get_bitstrings()}") print(f"> counts: {result[0].data.meas.get_counts()}") print(f"> Metadata: {result[0].metadata}") -
複数の
BitArrayメソッドを追加した。concatenate()配列の既存の軸に沿って配列を結合する。concatenate_bits()ビット軸に沿って配列を結合する。concatenate_shots()ショット軸に沿って配列を結合する。
ba = BitArray.from_samples(['00', '11']) print(ba) # BitArray(<shape=(), num_shots=2, num_bits=2>) # reshape the bit array because `concatenate` requires an axis. ba_ = ba.reshape(1, 2) print(ba_) # BitArray(<shape=(1,), num_shots=2, num_bits=2>) ba2 = BitArray.concatenate([ba_, ba_]) print(ba2.get_bitstrings()) # ['00', '11', '00', '11'] # `concatenate_bits` and `concatenates_shots` do not require any axis. ba3 = BitArray.concatenate_bits([ba, ba]) print(ba3.get_bitstrings()) # ['0000', '1111'] ba4 = BitArray.concatenate_shots([ba, ba]) print(ba4.get_bitstrings()) # ['00', '11', '00', '11'] -
オブジェクトのサブセットを生成するメソッドが追加された。
BitArrayメソッドを追加した。__getitem__()配列の既存の軸に沿ってスライスする。slice_bits()ビット軸に沿って配列をスライスする。slice_shots()ショット軸に沿って配列をスライスする。
ba = BitArray.from_samples(['0000', '0001', '0010', '0011'], 4) print(ba) # BitArray(<shape=(), num_shots=4, num_bits=4>) print(ba.get_bitstrings()) # ['0000', '0001', '0010', '0011'] ba2 = ba.reshape(2, 2) print(ba2) # BitArray(<shape=(2,), num_shots=2, num_bits=2>) print(ba2[0].get_bitstrings()) # ['0000', '0001'] print(ba2[1].get_bitstrings()) # ['0010', '0011'] ba3 = ba.slice_bits([0, 2]) print(ba3.get_bitstrings()) # ['00', '01', '00', '01'] ba4 = ba.slice_shots([0, 2]) print(ba3.get_bitstrings()) # ['0000', '0010'] -
メソッドを追加した。
transpose()メソッドを追加した。BitArray.ba = BitArray.from_samples(['00', '11']).reshape(2, 1, 1) print(ba) # BitArray(<shape=(2, 1), num_shots=1, num_bits=2>) print(ba.transpose()) # BitArray(<shape=(1, 2), num_shots=1, num_bits=2>) -
対角作用素の期待値を計算する
expectation_values()対角演算子の期待値を計算するメソッドを追加。ba = BitArray.from_samples(['01', '11']) print(ba.expectation_values(["IZ", "ZI", "01"])) # [-1. 0. 0.5] -
DataBinこれでShapedプロトコルを満たす。 つまり、すべてのDataBinインスタンスが追加属性形状はコンストラクタに渡すことができる。
-
にマッピングのような機能を追加。
DataBinすなわち、__getitem__,__contains__,__iter__、keys(),values()そしてitems().from qiskit import QuantumCircuit from qiskit.primitives import StatevectorSampler circuit = QuantumCircuit(1) circuit.h(0) circuit.measure_all() sampler = StatevectorSampler() result = sampler.run([circuit]).result() databin = result[0].data for creg, arr in databin.items(): print(creg, arr) for creg in databin: print(creg, databin[creg]) -
サブクラス
SamplerPubResultのPubResultのサブクラスが追加された。BaseSamplerV2のサブクラスが追加されました。 この新しいサブクラスで追加された主な機能はjoin_data()の内容(のサブセット)を1つのオブジェクトに結合することである。dataの内容 (のサブセット) を単一のオブジェクトに結合することです。 これにより、以下のパターンが可能になる:job_result = sampler.run([pub1, pub2, pub3], shots=123).result() # assuming all returned data entries are BitArrays counts1 = job_result[0].join_data().get_counts() bistrings2 = job_result[1].join_data().get_bitstrings() array3 = job_result[2].join_data().array
プロバイダー機能
- を使用しています。
BasicSimulatorに含まれるpythonベースのシミュレータはbasic_providerで定義された3量子ビットまでの標準ゲートの実行をサポートするようになりました。qiskit.circuit.library.
パルス機能
-
パルス
ScheduleおよびScheduleBlockオブジェクトに割り当てることができるようになりました。 パラメータ名を使用して、すべてのパラメータに値を割り当てることができます。ScheduleまたはScheduleBlock内にあるすべてのパラメータに値を割り当てることができる。 さらにParameterVectorのパラメータ名は、ベクトルのすべての値を同時に代入するために使用することができます(したがって、値のリストはベクトルの長さに一致する必要があります)。 -
の
assign_parameters。ScheduleとScheduleBlockのメソッドはParameterVectorのメソッドは、個々のインスタンスを個々の値に割り当てるだけでなく、同時にパラメータ値のリストに割り当てることができるようになりました。Parameterインスタンスを個々の値に割り当てることに加えて
OpenQASM 特徴
- OpenQASM 3 エクスポーターは、マニュアル・ストレージ・ノードをサポートしている。
Varノードをサポートしています。
QPYの特長
- QPY (
qiskit.qpy)フォーマットのバージョン12が追加されました。Var変数のサポートが追加されました。 フォーマットの変更の詳細については、 バージョン12をご覧ください。
量子情報の特徴
-
新しい
apply_layout()メソッドを追加した。apply_layout(). このメソッドはTranspileLayoutこのメソッドはトランスパイラからのレイアウトをPauliこのメソッドは、トランスパイラからのレイアウトを入力回路用に構築されたobservableに適用するために使用されます。 これにより、BaseEstimator/BaseEstimatorV2の実装と局所的な転置ができるようになります。Pauli. 例:from qiskit.circuit.library import RealAmplitudes from qiskit.primitives import BackendEstimatorV2 from qiskit.providers.fake_provider import GenericBackendV2 from qiskit.quantum_info import Pauli from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager psi = RealAmplitudes(num_qubits=2, reps=2) H1 = Pauli("XI") backend = GenericBackendV2(num_qubits=7) estimator = BackendEstimatorV2(backend=backend) thetas = [0, 1, 1, 2, 3, 5] pm = generate_preset_pass_manager(optimization_level=3, backend=backend) transpiled_psi = pm.run(psi) permuted_op = H1.apply_layout(transpiled_psi.layout) res = estimator.run([(transpiled_psi, permuted_op, thetas)]).result()ここで入力回路は、
run()に渡される前にローカルでトランスパイルされる。H1Transpilationは、元の回路を2量子ビットから7量子ビットに拡張し(backendのサイズ)、そのレイアウトを順列化する。apply_layout()を使用して、pm.run()で実行された変換を反映します。 -
を追加する。
PauliList.noncommutation_graph()とSparsePauliOp.noncommutation_graph()メソッドを追加し、非整約グラフの構築を公開し、測定オペレータのグループ化問題をグラフの色付け問題に再構成する。 これにより、ユーザーはこれらのグラフを直接扱うことができる。SparsePauliOp.group_commuting(). -
の性能は
SparsePauliOp.to_matrix()の性能は、密な形式でも疎な形式でも大幅に改善された。 デフォルトでは、RAYON_NUM_THREADS環境変数に従って、どちらもシステムで利用可能なスレッド並列性を利用するようになる。 新しいforce_serialのブール引数を使えば、一時的にシリアル実行を強制することができる。to_matrix().
合成機能
-
プラグイン
KMSSynthesisLinearFunctionオブジェクトを合成するLinearFunctionオブジェクトを合成するプラグインに、use_invertedとuse_transposedの2つのオプションが追加されました。 これらのオプションは、基本的な合成アルゴリズムが実行されるマトリックスを、場合によっては反転や転置によって変更し、合成された回路を適切に調整する。 これらのオプションを変えることで、一般的に異なる合成回路が得られ、場合によってはデフォルト値よりも良い結果が得られるかもしれない。 -
プラグイン
PMHSynthesisLinearFunctionオブジェクトを合成するLinearFunctionオブジェクトを合成するプラグインは、いくつかの追加オプションを受け付けるようになった。 オプションsection_sizeは、基礎となる合成メソッドに渡される。 オプションuse_invertedとuse_transposedは、合成アルゴリズムが実行される行列を、場合によっては反転や転置によって変更し、合成された回路を適切に調整します。 これらのオプションを変えることで、一般的に異なる合成回路が得られ、場合によってはデフォルト値よりも良い結果が得られるかもしれない。 -
に新しい引数
use_dagを追加。TwoQubitBasisDecomposer.__call__()とXXDecomposer.__call__()メソッドに新しい引数 この引数はDAGCircuitを呼び出すときにTwoQubitBasisDecomposerまたはXXDecomposerインスタンスを呼び出すときに、デフォルトのQuantumCircuit. 例:from qiskit.circuit.library import CXGate from qiskit.quantum_info import random_unitary from qiskit.synthesis import TwoQubitBasisDecomposer decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="PSX") decomposer(random_unitary(4), use_dag=True)を呼び出すと
DAGCircuitを返します。TwoQubitBasisDecomposerdecomposerを返す。 -
LieTrotter.synthesize()を使うようになった。QuantumCircuit.repeat()を使って、最初のトロッター・ステップの後にさらにトロッター・ステップの繰り返しを生成している。 これによりQuantumCircuit.compose()reps、大規模な演算子の実行時間を大幅に短縮する。 -
新しい合成法の追加
synth_permutation_reverse_lnn_kms()Kutin、Moulton、Smithline法を用いた線形最近傍アーキテクチャの逆順列合成法を追加。 このアルゴリズムは、 の深さを持つCXゲートを用いて、 の量子ビット上の逆順列を線形最近傍アーキテクチャ上で合成する。 -
この
TwoQubitBasisDecomposerクラスはRustで書き直され、実行時のパフォーマンスが大幅に向上した。 -
合成クラスは
TwoQubitWeylDecomposition合成クラスはパフォーマンス向上のためにRustで書き直された。
トランスパイラ機能
-
CommutationCheckerすなわち、入力量子回路の各演算は、解析ステップに進む前に行列表現がチェックされるようになった。 以前は、整流解析は物理回路に対してのみ行われていた。 さらに、各オペレーションがセッション計算ライブラリにキャッシュされるかどうかがチェックされるようになった。 例えばAnnotatedOperationを計算できるようになった。 これによって、CommutationCheckerに内部的に依存するトランスパイラ・パス、たとえばCommutativeCancellationをデフォルトのトランスパイルパイプラインの初期段階(基底変換の前)で実行できるようになります。 -
トランスパイラー・パスは
ElidePermutationsは、最適化レベル2と3のinitステージでデフォルトで実行されます。 直感的にはSwapGateやPermutationGateを削除することは、回路が短くなり、ルーティングが容易になるため、ほとんどの場合、有益である。OptimizeSwapBeforeMeasureはElidePermutationsであるため、最適化レベル3のパス・マネジャーのinitステージの一部として、ElidePermuationsパスで置き換えられている。 -
新しい最適化トランスパイラパスを追加しました。
ElidePermutationsレイアウトステージの前に実行するように設計されており、SwapGateとPermutationGate仮想量子ビットを並べ替えることで回路を構成します。 例えばSwapGates:
はパスが実行されるとスワップを削除する:
from qiskit.transpiler.passes import ElidePermutations from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3) qc.h(0) qc.swap(0, 1) qc.swap(2, 0) qc.cx(1, 0) qc.measure_all() ElidePermutations()(qc).draw("mpl")
このパスでは、
virtual_permutation_layoutプロパティセットも設定され、最適化された回路の最後にある仮想量子ビットの並べ替えが保存される。 -
が追加された。
HLSConfigには2つのオプション引数が追加された。 引数plugin_selectionには、"sequential"または"all"のどちらかを設定する。 sequential"(デフォルト)に設定すると、すべての上位レベルのオブジェクトに対してHighLevelSynthesisパスでは、指定されたメソッドがリストに現れる順番に順次検討され、オブジェクトを合成できる最初のメソッドで停止します。 all "に設定すると、指定されたすべての方法が考慮され、plugin_evaluation_fnに従って最適な合成回路が選択される。 引数plugin_evaluation_fnは、合成された量子回路の品質を評価するオプションの callable で、値が小さいほど良い回路であることを意味する。Noneに設定した場合、回路の品質はそのサイズ(すなわち、その回路に含まれるゲートの数)となる。次の例は新機能を説明するものである:
from qiskit import QuantumCircuit from qiskit.circuit.library import LinearFunction from qiskit.synthesis.linear import random_invertible_binary_matrix from qiskit.transpiler.passes import HighLevelSynthesis, HLSConfig # Create a circuit with a linear function mat = random_invertible_binary_matrix(7, seed=37) qc = QuantumCircuit(7) qc.append(LinearFunction(mat), [0, 1, 2, 3, 4, 5, 6]) # Run different methods with different parameters, # choosing the best result in terms of depth. hls_config = HLSConfig( linear_function=[ ("pmh", {}), ("pmh", {"use_inverted": True}), ("pmh", {"use_transposed": True}), ("pmh", {"use_inverted": True, "use_transposed": True}), ("pmh", {"section_size": 1}), ("pmh", {"section_size": 3}), ("kms", {}), ("kms", {"use_inverted": True}), ], plugin_selection="all", plugin_evaluation_fn=lambda circuit: circuit.depth(), ) # synthesize qct = HighLevelSynthesis(hls_config=hls_config)(qc)この例では、パラメータを変えて複数の合成法を実行し、深さの点で最良の回路を選択する。 なお、
circuit.size()を最適化すると、別の回路を選ぶことになる。 -
を追加した。
CommutativeCancellation最適化レベル2と3のプリセット・パス・マネージャーのinitステージにパスを追加。 これにより、プリセット・パス・マネージャーは、コンパイル・パイプラインの先頭で追加の論理演算をキャンセルすることができる。 -
でエンコードされた制約を受け付けるようになった。
Targettargetでエンコードされた制約を受け付けるようになりました:ターゲット制約は、トランスパイラ・パイプラインの他の部分との一貫性を保つために、ユーザーが提供する制約よりも優先されます。
-
新しいメソッド
Layout.inverse()これはLayoutオブジェクトの逆数を取るための新しいメソッドを追加した。 新しいメソッドLayout.compose()メソッドを追加した。Layoutメソッドを追加した。 新しいメソッドLayout.to_permutation()メソッドを追加した。Layoutオブジェクトに対応する -
トランスパイラー・パスに
OptimizeAnnotatedを追加した。 このリダクションでは、注釈付き操作(基本操作 と制御修飾子および逆修飾子およびべき乗修飾子のリスト から構成されるAnnotatedOperation基本操作 、制御、逆変換、べき乗修飾子のリスト )を探します:- 基本操作 を合成する必要がある(つまり、ターゲットですでにサポートされていないか、等価ライブラリに属していない)
- の定義回路は、 - - で表すことができる。
この場合、修正記号は -部分にのみ移動できる。 具 体 的 な 例 と し て、制 御 さ れ た Q F T ベ ー ス の 加 算 器 は
control - [QFT -- U -- IQFT]の 形 式 を と り、簡 略 し てQFT -- control-[U] -- IQFTと す る こ と が で き る。 回路のQFT、IQFT部分に対する制御を取り除くことで、トランスパイルド回路のゲート数を大幅に減らすことができる。 -
クラスに2つの新しいメソッドを追加した。
DAGCircuitクラスにqiskit.dagcircuit.DAGCircuit.op_successors()ノードの後継者へのイテレータを返すDAGOpNodeへのイテレータを返す。qiskit.dagcircuit.DAGCircuit.op_successors()ノードの前任者へのイテレータを返すDAGOpNodeイテレータを返します。 -
新しいトランスパイラー・パスを追加、
RemoveFinalResetを追加した。Reset演算を削除します。 例えばResets:
パスが実行されると、最後のリセットは取り除かれる:
from qiskit.transpiler.passes import RemoveFinalReset from qiskit.circuit import QuantumCircuit qc = QuantumCircuit(3, 1) qc.reset(0) qc.h(range(3)) qc.cx(1, 0) qc.measure(0, 0) qc.reset(range(3)) RemoveFinalReset()(qc).draw("mpl")
-
新しいトランスパイラー・パスを追加
StarPreRoutingこれは、スター接続の部分回路を特定し、最適な線形配線に置き換えるように設計されています。 これは、Bernstein-VaziraniやQFTなど、この回路接続性で構成される特定の回路に有効である。 例:
from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import StarPreRouting qc = QuantumCircuit(5) qc.h(0) qc.cx(0, range(1, 5)) StarPreRouting()(qc).draw("mpl")
あるいは、既存のプリセット・パス・マネージャーを拡張することもできる:
from qiskit import QuantumCircuit from qiskit.transpiler import CouplingMap from qiskit.transpiler.passes import StarPreRouting from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager cm = CouplingMap.from_line(5) qc = QuantumCircuit(5) qc.h(0) qc.cx(0, range(1, 5)) pm = generate_preset_pass_manager(2, coupling_map=cm) pm.init += StarPreRouting() result = pm.run(qc) result.draw("mpl")
可視化機能
- テキストと Matplotlib 回路ドロワー (
QuantumCircuit.draw())は、手動リアルタイム変数を含む式を表示するための最小限のサポートしか持っていません。 演算と変数の初期化はまだサポートされていません。Store大規模な動的回路では、 OpenQASM 3 のエクスポート機能 (qasm3.dumps())を使って回路のテキスト表現を得ることをお勧めします。
各種 機能
- Qiskit の本リリースでは、 NumPy 2.0 のサポートを最終的に完了しました。 Qiskitは当面、 NumPy 1.x、 2.x の両方をサポートし続ける。
アップグレードの注意
-
のスタイル・オプションのハード・コーディングを削除します。
plot_histogram(). これにより、 Matplotlib スタイルファイルを忠実に図に適用することができる。 Matplotlib で設定されたデフォルトを超えたいユーザーは、独自のスタイル・ファイルを作成するか、 MatplotlibAxesオブジェクトをplot_histogramに渡し、カスタマイズを後付けすることができる。 -
この
transpile()関数がアップグレードされ、バックエンドの入力を内部的にBackendV1をBackendV2に内部的に変換するようにアップグレードされ、これによりトランスパイルパイプラインがTarget. この変更にユーザーによる操作は必要ない。
回路アップグレードに関する注意事項
-
の乱数の使い方が変更されました。
QuantumVolumeの使用法が変更されたため、Qiskitの古いバージョンとこのバージョンでは固定シードに対する回路が異なります。 ランダム・ユニタリー生成では、より多くのビットのエントロピーが使われるようになったので、大規模な回路でも偏りが少なくなる。 -
内部
UnitaryGateの定義における内部インスタンスはQuantumVolume回路定義の内部インスタンスにはlabelフィールドを持たなくなる。 以前は、su4_<seed>という文字列に設定されていました。<seed>は、そのゲートの内部Numpy pRNG インスタンスのシードを示す3桁の数字です。 ゲートから行列を取り出す必要がある場合は、単にGate.to_matrix()メソッドを使えばよい。
プリミティブのアップグレードに関する注意事項
- 関数
make_data_bin()は、もはやDataBinサブクラスを生成して返すことはなくなりました。 代わりに常にDataBinクラスを返します。 しかし、後方互換性のために存在し続けているが、いずれは非推奨となる。 すべてのユーザーはDataBinmake_data_bin()が出力するサブクラスをインスタンス化するのではなく、直接インスタンスを構築する必要があります。
プロバイダー向けアップグレードノート
-
の実装
BackendV2(およびBackendV1の実装はrun()メソッドを更新して、型付けされた古典変数を含む入力を熱心に拒否するようにしたいかもしれない(qiskit.circuit.classical参照)とStoreを参照)を含む入力を拒否するようにメソッドを更新したいと思うかもしれない。 新しいStore命令は、トランスパイラによって、常に利用可能な「ディレクティブ」として扱われます。Barrierバックエンドがこれをサポートしていない場合はtranspiler.詳しくはリアルタイム変数を参照。
QPY アップグレードに関する注意事項
- の値は
qiskit.qpy.QPY_VERSIONの値は12になった。QPY_COMPATIBILITY_VERSIONは10で変わらない。
合成アップグレードに関する注意事項
- そのため
TwoQubitWeylDecompositionは作成時にサブクラスに自己特化しなくなった。 これはTwoQubitWeylDecompositionの内部的な詳細であり、すべてのサブクラスが同じ振る舞いをし、内部ディスパッチにのみ使用されるため、文書化されたパブリックな振る舞いではありませんでした。 しかし、これは発見可能な動作であったため、このリリースノートでは、今後はこのような現象は発生せず、すべてのTwoQubitWeylDecompositionのインスタンスはすべて同じ型になります。 クラスのパブリック・メソッドの動作に変更はない。
トランスパイラ アップグレード ノート
- プリセット
StagedPassManagerによって最適化レベル2に返されるgenerate_preset_pass_manager()とlevel_2_pass_manager()によって返されるプリセットは、実行時間と最適化のバランスがより良くなるように作り直された。 つまり、以前のリリースと比べると出力回路が変わるということだ。 以前のリリースのレベル2の正確なパス・マネージャーが必要な場合は、手動でビルドするか、以前のリリースのものを使用し、新しいリリースでロードするために回路をqpyで保存し、新しいリリースで読み込むことができます。
各種 アップグレードの注意
- Windowsの最小サポートバージョンはWindows 10になりました。 以前のリリースでは、Windowsの最小サポートバージョンを明示的にリストアップしていなかったため、暗黙のうちにWindows 7、8、 8.1 が動作していた可能性があります(ただし、テストされたことはありません)。 しかし、Rust 1.78 がWindowsの旧バージョンのサポートを終了したため、Qiskitが PyPI で公開しているバイナリは、このリリースからWindowsの旧バージョンをサポートしなくなりました。 古いバージョンのWindowsを使用している場合でも、古いRustコンパイラを使用してソースからQiskitをビルドできる可能性があります(ソースからビルドするためのQiskitの最小サポートRustバージョンは現在 1.70 )が、古いバージョンのWindowsはサポートされていないプラットフォームであり、テストされていません。
非推奨のメモ
-
Python 3.8 で Qiskit を実行するためのサポートは非推奨となり、Qiskit 1.3.0 リリースで削除される予定です。 1.3.0 は、 Python 3.8 がサポート終了となった後の最初のリリースである。 [1] これは、 1.3.0 リリースから、使用している Python バージョンを Python 3.9 以上にアップグレードする必要があることを意味します。
プロバイダーの廃止予定
-
抽象基底クラス
ProviderおよびProviderV1は非推奨となり、Qiskit 2.0.0 で削除される予定です。 これらのインターフェイス定義が提供する抽象化は、実質的な価値を提供するものではなく、name、backends、get_backend()という属性をカプセル化したに過ぎない。 概念として、バックエンドの集合体として存在し続ける。 現在プロバイダーを実装している場合は、ProviderV1を実装の親クラスとして削除するだけで、コードを調整できる。 その一環として、後方互換性のためにget_backend。 例:def get_backend(self, name=None, **kwargs): backends = self.backends(name, **kwargs) if len(backends) > 1: raise QiskitBackendNotFoundError("More than one backend matches the criteria") if not backends: raise QiskitBackendNotFoundError("No backend matches the criteria") return backends[0]
合成の非推奨
- この
TwoQubitWeylDecomposition.specialize()メソッドは非推奨となり、Qiskit 2.0.0 リリースで削除される予定です。 このメソッドにはパブリックな目的はなく、エンドユーザーが呼び出すと、オブジェクト内の計算分解が変異し、オブジェクト内に無効なフィールドが生成されるため、安全ではなかった。 これは、新しいTwoQubitWeylDecompositionオブジェクトを構築するためにのみ使用される。 にもかかわらず、このクラスのパブリックAPIの一部として文書化されていた。 このリリースでは、クラスのRust書き換えの一環として特殊化サブクラス化が削除されたため、呼び出されると常にNotImplementedError。
トランスパイラーの非推奨機能
-
パス
qiskit.transpiler.passes.CXCancellationは廃止され、より汎用的なInverseCancellationより汎用的なCXCancellationは意味的にInverseCancellation([CXGate()])と完全に等価である。 -
トランスパイルパス
qiskit.transpiler.passes.ALAPScheduleは非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 で置き換えられる。ALAPScheduleAnalysisこれは分析パスである。 -
トランスパイルパス
qiskit.transpiler.passes.ASAPScheduleは非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 に取って代わられた。ASAPScheduleAnalysisと新しいスケジューリングワークフローに取って代わられました。 -
トランスパイルパス
qiskit.transpiler.passes.DynamicalDecouplingは非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 代わりにPadDynamicalDecouplingこれは同じ機能を実行するが、その前にスケジューリングとアライメント解析のパスを実行する必要がある。 -
トランスパイルパス
qiskit.transpiler.passes.AlignMeasuresは非推奨となった。 2022年6月にリリースされたQiskit 0.37 (with Terra 0.21 ) 以降、非推奨のため保留となっていた。 代わりにConstrainedRescheduleを使う。
可視化の非推奨機能
- タイムライン引き出しのパラメータ
show_idleとshow_barrierは、回路引き出しのパラメータに合わせて、それぞれidle_wiresとplot_barriersに置き換えられていた。 以前の名称は非推奨となり、次回のメジャーリリースで削除される。 新しいパラメータは完全に同等である。
バグ修正
-
関数の問題を修正した。
qpy.dump()関数の問題を修正しました。use_symengineフラグがTrueと評価される真理値オブジェクトに設定されていますが、実際にはブール値Trueではなかった場合、生成される QPY ペイロードが破損していました。 例えば、use_symengineをHAS_SYMENGINEに設定すると、このオブジェクトはboolとしてキャストされたときにTrueと評価されるが、実際にはTrue。 -
の問題を修正しました。
circuit_drawer()関数とQuantumCircuit.draw()メソッドの問題を修正しました。 -
回路に
ConstrainedRescheduleトランスパイラ・パスが、回路にReset命令が含まれている場合、トランスパイラ・パスがエラーになる問題を修正しました。 これは修正され、パスのエラーはなくなりましたが、実際のハードウェアはQiskitスケジューラが想定している動作とは異なる場合があります。 Qiskitスケジューラは、以下のいずれかを含む回路に遭遇した場合、RuntimeWarning。 修正 #10354 -
CommutationChecker、ゲートの属性が。name属性が UTF8 エンコードされているとエラーになる問題を修正した。 以前は、asciiエンコーディングのゲート名しか機能しなかった。 修正 #12501 -
の問題を修正しました。
SparsePauliOp.apply_layout()とPauli.apply_layout()メソッドで、layout引数に重複または負のインデックスを持つ無効な配列が渡された場合の問題を修正しました。 以前はエラーにならず、実行された変換は有効ではなかった。 これらのメソッドはQiskitErrorを発生させるようになりました。 -
のパフォーマンスの問題を修正しました。
BackendSamplerV2そしてBackendEstimatorV2. 修正 #12290 -
の問題を修正した。
convert_to_target()コンバーターが、BackendConfiguration.supported_instructions属性に制御フロー命令を指定すると、制御フロー命令を誤って無視してしまう問題を修正しました。BackendConfigurationオブジェクトで指定される典型的な場所です。 #11872 を修正。 -
の問題を修正しました。
circuit_drawer()またはQuantumCircuit.draw()mpl出力オプション使用時、描画される回路に ControlFlow 操作があり、foldオプションが -1 (折り返しがない) に設定されている場合、プログラムがハングする問題を修正しました。 修正 #12012。 -
カスタム・パルス命令のレガシー形式への変換におけるバグを修正。
qiskit.qobjフォーマットへの変換のバグを修正しました。 このバグはQiskit 1.0.0 で導入されたもので、カスタムパルス形状の命令を変換するとエラーが発生する。 修正後、変換は正しく実行され、カスタムパルスは本来のようにWaveformに変換されます。 #11828 を修正。 -
のバグが修正されました。
transpile()型のバックエンドと同時に提供された場合、カスタムのinstruction_durations,dt,backend_properties制約が無視されるバグが修正されました。BackendV2. 修正後の動作は、提供されたバックエンドの型がBackendV1型かBackendV2. 同様に、カスタムtiming_constraintsは、target入力によってオーバーライドされるようになった。BackendV1とBackendV2入力よりも優先される。 -
を呼び出すと
EquivalenceLibrary.set_entry()を呼び出すと、ライブラリーの内部グラフ・オブジェクトが正しく更新されるようになった。 以前は、メタデータは更新されたが、グラフ構造は変更されなかった。BasisTranslatorのようなユーザーは古いルールを使い続けることになる。 #11958 を修正。 -
これにより
EvolvedOperatorAnsatzは、演算子の引数が空リストの場合を正しく処理するようになった。 以前はエラーになっていた。 -
これからは
EvolvedOperatorAnsatzは、量子ビットがゼロのときにはqregを持たない。QuantumRegisterインスタンスを持つ代わりに この動作は、スーパークラスとの整合性をより高めています。QuantumCircuit. -
メソッド
Instruction.repeat()メソッドはconditionを外側の返されたInstructionに移動し、その定義の内側のゲートは無条件のままにする。 以前はClassicalRegisterインスタンスを内部定義に残していましたが、これは無効な状態であり、後でトランスパイルやエクスポートの際など、一見無関係なバグとして現れていました。 #11935 を修正。 -
の問題を修正しました。
InverseCancellationトランスパイラ・パスの問題で、パラメータ値が一致していなくても、自己逆パラメータ化されたゲートを誤ってキャンセルしてしまう場合がある問題を修正しました。 修正 #11815 -
ゲートの分解を改善する
MCXGateとMCPhaseGateの数が指数関数的ではなく、量子ビット数に対して二次関数的に増加するように。CXGateの数が指数関数的ではなく、量子ビットの数に対して二次関数的に増加するようにする。 -
をクラッシュさせるバグが修正されました。
convert_to_target()T1 T2 関数がクラッシュするバグが修正された。 の欠落しているプロパティ値はQubitPropertiesはNoneで埋められる。 -
BasePassManager.run()は、以前のPropertySetを複数回呼び出した場合でも、新しいワークフローに前のワークフローが漏れることはなくなった。 以前はPropertySetを使用していたため、無効なプロパティ情報がタスクに与えられていた可能性があった。 Qiskit 0.44 の動作と一致するようになった。 #11784 を修正。 -
Pauli.evolve()ECRゲートを含む量子回路が正しく処理されるようになった。 以前はクリフォード・ゲートと認識されておらず、誤りがあった。 -
のバグを修正した。
Pauli.evolve()で、特定のクリフォードゲート('cx'、'cz'など)と一致する名前の回路によって進化させると、回路の内容ではなく、回路の名前に従ってパウリを進化させてしまうというバグを修正した。 このバグは、デフォルトでないオプションframe='s'でのみ発生する。 -
のパフォーマンスに関する問題を修正しました。
qpy.load()関数のパフォーマンスの問題を修正しました。 -
の
default_alignment引数の処理のバグを修正。build(). タイプの入力AlignmentKind型の入力は、デフォルトのアラインメントとして正しく処理されるようになりました。 -
qiskit.pulse.utils.format_parameter_value()関数において、意図せずに十分な大きさの整数値を float 値に変換したり、予期しない丸めを行うバグを修正。 詳細は #11971を参照。 -
クラスの問題を修正しました。
QDriftクラスの問題を修正しました。ハミルトニアンの係数が、以前は各係数の絶対値を取ることによって正になるように強制されていました。 これは、負の係数の符号を足し直すように修正された。 -
convert_durations_to_dt()において、回路の持続時間に対して、属性の元の単位とは無関係に、秒からdtへの変換がやみくもに適用されるバグが修正されました。 これは、報告された回路の持続時間に誤った桁をもたらす可能性がある。 -
修正
SparsePauliOp.apply_layout()ゼロ量子ビット演算子で正しく動作するように修正。 例えば、以前に0量子ビットを作成し、次のようなレイアウトを適用したとする:op = SparsePauliOp("") op.apply_layout(None, 3)というエラーが出ていたはずだ。 これで、演算子は正しく返されるようになった:
SparsePauliOp(['III'], coeffs=[1.+0.j]) -
トランスパイラー・パスの
Commuting2qGateRouterトランスパイラ・パスのqreg順列がパス・プロパティ・セットに追加されなかったため、ユーザーが手動で追跡する必要があった。 これで、出力回路のlayoutプロパティを通じて並べ替えにアクセスし、情報を失うことなくパスを任意のトランスピレーション・パイプラインにプラグインすることが可能になった。 -
特定のパルス単位を秒とナノ秒の間でスケーリングする際の浮動小数点の不正確さを修正。 パルスが記号的に定義されていた場合、
symengineの特定のビルドに対するスケーリングによって不要な浮動小数点エラーが発生する可能性があり、記号が完全にバインドされた後に予期しない結果が現れる可能性がある。 修正 #12392。 -
のプリセット・パス・マネージャは
transpile()は、ハードウェア・ターゲットまたはベーシス・ゲート・セットが指定されていない場合、制御フローを持つ回路で失敗しなくなります。 このような抽象的なターゲットは、すべてのコントロールフロー操作を許可するものとして扱われる。 #11906 を修正。 -
メソッド
qiskit.instruction.Instruction.soft_compare()は、2つのゲートの名前、量子ビット数、ビット数、パラメーターの数が一致するかどうかを比較するためのものである。 しかし、qubitsの数とclbitsの数が一致するかどうかをチェックしないタイプミスがあった。 これで明らかなタイプミスは解消された。 -
デフォルトの
initプラグインは、無効な最適化レベルで呼び出されたときにTranspilerErrorを適切に発生させていませんでした。 -
コンストラクタの
Operator.from_circuit()コンストラクタのメソッドで、最終的なレイアウト順列が正しく解釈されず、結果として無効なOperatorが構築される問題を修正しました。 以前は、最終レイアウトは初期レイアウトを無視して処理されていました。つまり、初期レイアウトが自明でない量子回路では、初期化が正しく行われていませんでした。 -
のパフォーマンスの問題を修正した。
PassManager.run()のパフォーマンスの問題を修正しました。 をシリアライズするのに時間を費やすことはない。PassManager(これは並列実行のための必要条件である)。 -
Parameterが更新され、比較するインスタンスが常に同じハッシュを持つようになった。 以前はParameter.uuidだけが比較されていた。Parameterのインスタンスが、uuidパラメータ(通常は明示的に渡されない)に共通の値を使用して構築されていた場合、異なる名前のインスタンスを等しく比較することができました。 -
plot_coupling_map()、カップリング・マップのエッジの色がおかしくなっていたバグを修正。 修正 #12369。 -
OpenQASM 2.0 パーサー (
qasm2.load()とqasm2.loads()) は、システム・サイズの整数をオーバーフローするような整数オペランドを含むゲート角式を評価できるようになりました。 これらは倍精度浮動小数点のコンテキストで評価される。 しかし、任意に大きな整数は、必ずしも倍精度浮動小数点で正確に表現できるわけではないので、回路がどのように生成されたとしても、すでにすべての数値精度をmodulo で失っている可能性がある。 -
ParameterOpenQASM 3プログラムのinput変数の代名詞として使用されるインスタンスは、 OpenQASM 3へのエクスポート時に組み込みゲートとの衝突を避けるため、名前がエスケープされるようになりました。 以前は名前の衝突が起こり、エクスポータが無効な OpenQASM 3を生成することがあった。 -
のバグを修正。
QuantumCircuit.draw()を修正しました。 Matplotlib ドロワーのカスタムスタイル辞書が実行時に変更される原因となっていました。 -
QuantumCircuit.append()インスタンスによってパラメータ化された命令は、copy=True(デフォルト)で正しくコピーされるようになりました。ParameterExpressionインスタンスではなくParameterインスタンスだけでなく -
カスタム回路キャリブレーションの内部処理と
InstructionDurationsの内部処理はtranspile()関数から個々のトランスパイラ・パスにオフロードされています:DynamicalDecouplingDynamicalDecoupling。以前は、回路較正からの命令持続時間は、instruction_durations入力引数に手動で組み込まれない限り考慮されませんでしたが、それが必要なパスは回路を分析し、次の優先順位に従って最も関連性の高い持続時間値を選択するようになりました:ターゲット>カスタム入力>回路較正。 -
のバグを修正した。
transpile()dtまたはinstruction_durationsが指定された場合のみnum_processes引数が使用されるバグを修正。
その他の注意事項
-
arm64 macOS プラットフォームのサポートがティア3からティア1に昇格した。 以前は、プラットフォーム上でQiskitをテストするための利用可能なCI環境がなかったため、プラットフォームはTier 3でした。 Githubが arm64 macOS 環境をオープンソース・プロジェクト [1] に提供したことで、私たちは他のTier 1がサポートするプラットフォームとともに、このプラットフォームをテストしている。
[1 ]
1.0.0rc1
プロバイダー向けアップグレードノート
-
非推奨の
qiskit.providers.fake_providerモジュールはqiskit-ibm-runtimePython パッケージに移行されました。 このためqiskit.providers.fake_providerの以下の要素はQiskitで非推奨となったため削除されました。 0.46:qiskit.providers.fake_provider.FakeProviderqiskit.providers.fake_provider.FakeProviderForBackendV2qiskit.providers.fake_provider.FakeProviderFactoryqiskit.providers.fake_provider.fake_backends.FakeBackendV2qiskit.providers.fake_provider.backendsに含まれる偽のバックエンド(プロバイダーを通してアクセスできる)qiskit.providers.fake_provider.FakeQasmSimulatorqiskit.providers.fake_provider.FakeJobqiskit.providers.fake_provider.FakeQobj
新しい偽プロバイダモジュールを使用するには、
pip install qiskit-ibm-runtimeを実行し、qiskit のインポートパス (qiskit.providers.fake_provider) を新しいインポートパス (qiskit_ibm_runtime.fake_provider) に置き換えます。移行例:# Legacy path from qiskit.providers.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke() # New path # run "pip install qiskit-ibm-runtime" from qiskit_ibm_runtime.fake_provider import FakeProvider, FakeSherbrooke backend1 = FakeProvider().get_backend("fake_ourense") backend2 = FakeSherbrooke()さらに、特別なテスト目的で設計された以下の偽のバックエンドは、新しい
GenericBackendV2クラスに取って代わられ、Qiskit では非推奨となったため削除されました。 0.46:qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2`qiskit.providers.fake_provider.fake_backend_v2.FakeBackendV2LegacyQubitPropsqiskit.providers.fake_provider.fake_backend_v2.FakeBackend5QV2qiskit.providers.fake_provider.fake_backend_v2.FakeBackendSimple
新しいクラスへの移行例
GenericBackendV2クラスへの移行例です:# Legacy path from qiskit.providers.fake_provider import FakeBackend5QV2 backend = FakeBackend5QV2() # New path from qiskit.providers.fake_provider import GenericBackendV2 backend = GenericBackendV2(num_qubits=5) # note that this class will generate 5q backend with generic # properties that serves the same purpose as FakeBackend5QV2 # but will generate different results