Qiskit 0.40 リリースノート
0.40.0
このリリースでは、Qiskitメタパッケージの一部であるQiskit IBMQプロバイダプロジェクトを正式に非推奨とします。 これは、将来のリリースでは、 pip install qiskit が自動的に qiskit-ibmq-provider を含まないことを意味する。 現在、 qiskit-ibmq-provider を取得するために qiskit を依存関係としてインストールまたはリストアップしている場合は、 qiskit-ibmq-provider も明示的にインクルードするように更新する必要があります。 これは、Qiskitプロジェクトが、 qiskit 、量子回路、プログラム、アプリケーションのビルドとコンパイルのための共通コア機能のみをパッケージ化したモデルへと移行していく中で行われている。 そのコアの上に構築するパッケージや、Qiskitをハードウェアやシミュレータにリンクするパッケージは、別のパッケージとしてインストール可能です。
Terra 0.23.0
前奏曲
Qiskit Terra 0.23.0 は、多数の新機能とバグ修正を含むメジャー機能リリースです。 今回のリリースのハイライトは以下の通り:
OpenQASM 3 プログラムのインポートおよび入力プログラムからのオブジェクトの作成をサポート。
QuantumCircuitつの新しい関数qiskit.qasm3.load()とqiskit.qasm3.loads().Qiskitに含まれる合成アルゴリズムライブラリの改良。 これには以下の新しい合成機能が含まれる:
クリフォード合成
線形関数合成:
順列合成:
SolovayKitaevDecompositionに詳しい: https://arxiv.org/abs/quant-ph/0505030新しいプラグイン
HighLevelSynthesis:
ACGSynthesisPermutationKMSSynthesisPermutationBasicSynthesisPermutation新しいプラグイン
UnitarySynthesisのパフォーマンス向上
SabreLayout. パスは主にRustで書かれるようになり、実行時間が改善された。SwapGateゲートの数がSabreSwap). 例えばSabreLayoutとSabreSwapをBernstein Vazirani回路で実行すると、次のような結果になる。FakeSherbrookeを実行すると、次のような結果が得られる:![]()
このリリースでは、 Python 3.7。 Qiskit を Python 3.7 で実行すると DeprecationWarning が表示されます。 Python 3.7 のサポートは 0.25.0 リリース(現在2023年7月リリース予定)の一部として削除される予定です。その時点で、Qiskitを使用するには Python 3.8 またはそれ以降が必要になります。
新機能
-
のパルスは
qiskit.pulse.libraryを新しいパラメータ
angleで初期化することで、ampとangleの2つのフロート・パラメータを提供することができる。 複素数ampを使った初期化も引き続きサポートされている。 -
この
AdaptVQEクラスには新しい属性があります、eigenvalue_historyこれは、 AdaptVQE の反復ごとに達成される最低エネルギーを追跡するために使われます。 例:from qiskit.algorithms.minimum_eigensolvers import VQE from qiskit.algorithms.minimum_eigensolvers.adapt_vqe import AdaptVQE from qiskit.algorithms.optimizers import SLSQP from qiskit.circuit.library import EvolvedOperatorAnsatz from qiskit.opflow import PauliSumOp from qiskit.primitives import Estimator from qiskit.quantum_info import SparsePauliOp from qiskit.utils import algorithm_globals excitation_pool = [ PauliSumOp( SparsePauliOp(["IIIY", "IIZY"], coeffs=[0.5 + 0.0j, -0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp(["ZYII", "IYZI"], coeffs=[-0.5 + 0.0j, 0.5 + 0.0j]), coeff=1.0 ), PauliSumOp( SparsePauliOp( ["ZXZY", "IXIY", "IYIX", "ZYZX", "IYZX", "ZYIX", "ZXIY", "IXZY"], coeffs=[ -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, 0.125 + 0.0j, -0.125 + 0.0j, ], ), coeff=1.0, ), ] ansatz = EvolvedOperatorAnsatz(excitation_pool, initial_state=self.initial_state) optimizer = SLSQP() h2_op = PauliSumOp.from_list( [ ("IIII", -0.8105479805373266), ("ZZII", -0.2257534922240251), ("IIZI", +0.12091263261776641), ("ZIZI", +0.12091263261776641), ("IZZI", +0.17218393261915543), ("IIIZ", +0.17218393261915546), ("IZIZ", +0.1661454325638243), ("ZZIZ", +0.1661454325638243), ("IIZZ", -0.2257534922240251), ("IZZZ", +0.16892753870087926), ("ZZZZ", +0.17464343068300464), ("IXIX", +0.04523279994605788), ("ZXIX", +0.04523279994605788), ("IXZX", -0.04523279994605788), ("ZXZX", -0.04523279994605788), ] ) algorithm_globals.random_seed = 42 calc = AdaptVQE(VQE(Estimator(), ansatz, self.optimizer)) res = calc.compute_minimum_eigenvalue(operator=h2_op) print(calc.eigenvalue_history)calc.historyの戻り値は、反復が1回なので、おおよそ[-1.85727503]。 -
を実行する際の実行時ロギングが改善されました。
AdaptVQEが改善された。 今このクラスを実行すると、DEBUGとINFOレベルのログ・メッセージがクラスの実行時に出力されます。 -
回路内のノードのブロックを収集し、統合するための新しいトランスパイラー・パス、
CollectAndCollapseを追加。 このパスは、ブロックの収集と統合を組み合わせた一般的な基本クラスとして設計されている。 完全に一般的に言うと、ブロックの収集と折りたたみの作業は、パスのインスタンス化時に提供される関数によって行われる。 例えばCollectLinearFunctionsは、CollectAndCollapseを継承するように更新され、以下のブロックを収集するようになった。CXGateとSwapGateゲートのブロックを集め、各ブロックをLinearFunction. を使用している。CollectCliffordsもCollectAndCollapseに基づいており、「クリフォード」ゲートのブロックを収集し、各ブロックをClifford.このインターフェイスは、より大きなノードのブロックを集めるために、ゲート間の可換性を利用できるオプション
do_commutative_analysisもサポートしている。 例えば、次の回路でCXゲートのブロックを集める:qc = QuantumCircuit(2) qc.cx(0, 1) qc.z(0) qc.cx(1, 0)do_commutative_analysisを使用すると、最初のCXゲートとZゲートが通勤するため、2つのCXゲートを統合することができる。 -
様々なコレクション戦略を実装する新しいクラス
BlockCollector、様々な折りたたみ戦略を実装する新しいクラスBlockCollapser。 現在、BlockCollectorには、与えられたフィルター関数に従うすべてのゲートを貪欲に収集する戦略(たとえば、すべてのクリフォードゲートを収集する)が含まれており、BlockCollapserには、ブロック内のすべてのゲートを単一のオブジェクトに統合する戦略が含まれている(たとえば、クリフォードゲートのブロックを単一のClifford). -
新しい
CollectCliffordsクリフォード・ゲートのブロックを収集し、これらのブロックをオブジェクトに統合する新しいトランスパイラー・パスを追加した。qiskit.quantum_info.Cliffordオブジェクトに統合します。 このパスはCollectAndCollapseを継承し、特にdo_commutative_analysisというオプションをサポートしている。 また、split_blocksとmin_block_sizeの2つのオプションもサポートしている。 詳細はCollectAndCollapseおよびCollectLinearFunctionsのリリースノートを参照のこと。 -
トランス
CollectLinearFunctionsトランスパイラー・パスのコンストラクターにはいくつかの新しい引数がある:-
do_commutative_analysisより大きなノードのブロックを集めるために、ゲート間の可換性を利用することができる。 -
split_blocksこれにより、収集したブロックを、量子ビットの不連続な部分集合上のサブブロックに分割することができる。 例えば、次のような回路である:qc = QuantumCircuit(4) qc.cx(0, 2) qc.cx(1, 3) qc.cx(2, 0) qc.cx(3, 1) qc.cx(1, 3)量子ビット
{0, 1, 2, 3}上のCXゲートの単一のブロックは、2つの不連続なサブブロック、1つは量子ビット{0, 2}上の、もう1つは量子ビット{1, 3}上のブロックに分割することができます。 -
min_block_sizeゲート数が少ないブロックは修正されない。 例えば、次のような回路である:qc = QuantumCircuit(4) qc.cx(1, 2) qc.cx(2, 1)2つのCXゲートは、
min_block_sizeが1または2のときに統合され、min_block_sizeが3以上のときは変更されない。
-
-
深さ効率の良い合成アルゴリズムを追加
synth_cnot_depth_line_kms()線形可逆回路のためのLinearFunctionを追加した: https://arxiv.org/abs/quant-ph/0701194. -
この
DAGCircuit.replace_block_with_op()メソッドは、ブロックを置き換えたときに生成される新しいDAGOpNodeを返すようになりました。 以前は、このメソッドを呼んでも何も返されなかった。 -
深度効率の良い合成アルゴリズムを追加
synth_permutation_depth_lnn_kms()を追加した。Permutationを追加した: https://arxiv.org/abs/quant-ph/0701194 -
新しいクラス
PermutationGateを追加した。 既存のPermutationこの新しいクラスは、宣言時に並べ替え回路を合成しないようにする。 これにより、トランスパイラーへの実際の合成が遅れる。 また、並べ替えを合成するためのいくつかの異なるアルゴリズムを使用することも可能で、これらは高レベル合成並べ替えプラグインとして提供されている。のもうひとつの重要な特徴は
PermutationGateは、順列のユニタリー行列を効率的に返すための__array__インターフェイスを実装していることである。 -
パーミュテーションを合成するためのハイレベル合成プラグインをいくつか追加:
BasicSynthesisPermutationこれは、完全に接続されたアーキテクチャに適用され、ソートに基づいている。 これは、順列の量子回路を構成するアルゴリズムとして以前から使われているものである。ACGSynthesisPermutationこれは完全接続アーキテクチャに適用されますが、Alon, Chung, Grahamの方法に基づいています。 これは、深さ2(SWAPの観点から測定)の任意の順列を合成する。KMSSynthesisPermutation線形最近傍アーキテクチャに適用され、最近追加されたKutin, Moulton, Smithline法に相当する。
例:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PermutationGate from qiskit.transpiler import PassManager from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig, HighLevelSynthesis from qiskit.transpiler.passes.synthesis.plugin import HighLevelSynthesisPluginManager # Create a permutation and add it to a quantum circuit perm = PermutationGate([4, 6, 3, 7, 1, 2, 0, 5]) qc = QuantumCircuit(8) qc.append(perm, range(8)) # Print available plugin names for synthesizing permutations # Returns ['acg', 'basic', 'default', 'kms'] print(HighLevelSynthesisPluginManager().method_names("permutation")) # Default plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis()).run(qc) print(f"Default: {qct.size() = }, {qct.depth() = }") # KMSSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 18 and depth 6 # but adhering to the linear nearest-neighbor architecture. qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("kms", {})]))).run(qc) print(f"kms: {qct.size() = }, {qct.depth() = }") # BasicSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 3 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("basic", {})]))).run(qc) print(f"basic: {qct.size() = }, {qct.depth() = }") # ACGSynthesisPermutation plugin for permutations # Returns a quantum circuit with size 6 and depth 2 qct = PassManager(HighLevelSynthesis(HLSConfig(permutation=[("acg", {})]))).run(qc) print(f"acg: {qct.size() = }, {qct.depth() = }") -
量子フィッシャー情報(QFI)と量子幾何学テンソル(QGT)アルゴリズム用の新しいクラスを追加しました。
primitives,qiskit.algorithms.gradients.QFIおよびqiskit.algorithms.gradients.LinCombQGT勾配モジュールに追加:qiskit.algorithms.gradients. 例:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.algorithms.gradients import LinCombQGT, QFI estimator = Estimator() a, b = Parameter("a"), Parameter("b") qc = QuantumCircuit(1) qc.h(0) qc.rz(a, 0) qc.rx(b, 0) parameter_value = [[np.pi / 4, 0]] qgt = LinCombQGT(estimator) qgt_result = qgt.run([qc], parameter_value).result() qfi = QFI(qgt) qfi_result = qfi.run([qc], parameter_value).result() -
のコンストラクタに新しいキーワード引数
derivative_typeを追加。LinCombEstimatorGradient. この引数は、勾配の実数部または虚数部のみを計算することを指定できるDerivativeTypeenumを取る。 -
ユーザー設定ファイルに新しいオプション
circuit_reverse_bitsを追加。 これにより、ユーザーは、回路ドロワのreverse_bits引数のデフォルトの動作に、好みのブーリアンを設定することができる。QuantumCircuit.draw()そしてcircuit_drawer(). 例えば、デフォルトの場所~/.qiskit/settings.conf、ユーザー設定ファイルにセクションを追加する:[default] circuit_reverse_bits = Trueはビットを逆順に表示するようにデフォルトを変更する。
-
新しいクラスを追加
Z2Symmetriesを追加した。qiskit.quantum_infoこれは入力から の対称性を識別するために使われる。SparsePauliOp. -
新しいパルス指令の追加
TimeBlockade. この命令はdelay命令とほとんど同じ動作をするが、実行前に削除される。 このディレクティブはパルスビルダー内部で使用され、絶対時間間隔の命令を表現するのに役立ちます。ScheduleBlock絶対時間間隔の命令を表現するのに役立ちます。 これにより、パルスビルダーは、Scheduleを、命令でラッピングするのではなく、ScheduleBlockに変換することができる。Callに変換することができる。 -
量子時間発展(Quantum Time Evolution)のインターフェイスを実装した、変分量子時間発展(Variational Quantum Time Evolution)のプリミティブ対応アルゴリズムを追加。 この
qiskit.algorithms.VarQRTEクラスは実数、qiskit.algorithms.VarQITEクラスは変分原理による虚数量子時間進化に使用される。各アルゴリズムは、抽象インターフェースを実装する変分原理を受け入れる。
ImaginaryVariationalPrincipleを実装する変分原理を受け入れる。 以下の実装が含まれる:例:
from qiskit.algorithms import TimeEvolutionProblem, VarQITE from qiskit.algorithms.time_evolvers.variational import ImaginaryMcLachlanPrinciple from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp import numpy as np observable = SparsePauliOp.from_list( [ ("II", 0.2252), ("ZZ", 0.5716), ("IZ", 0.3435), ("ZI", -0.4347), ("YY", 0.091), ("XX", 0.091), ] ) ansatz = EfficientSU2(observable.num_qubits, reps=1) init_param_values = np.zeros(len(ansatz.parameters)) for i in range(len(ansatz.parameters)): init_param_values[i] = np.pi / 2 var_principle = ImaginaryMcLachlanPrinciple() time = 1 evolution_problem = TimeEvolutionProblem(observable, time) var_qite = VarQITE(ansatz, var_principle, init_param_values) evolution_result = var_qite.evolve(evolution_problem) -
変換ルールを追加
XXPlusYYGateとXXMinusYYGateSessionEquivalenceLibraryを他のゲートに変換するルールを追加した。 これによりtranspile()バックエンドまたはTargetこれらのゲートを使用する -
2つの新しいフェイクバックエンドを追加、
FakePragueとFakeSherbrookeをqiskit.providers.fake_providerモジュールにFakePragueは、 IBM Prague Egret R1 のプロパティのスナップショットをバックエンドに提供します。FakeSherbrookeは、 IBM Sherbrooke Eagle R3 のプロパティのスナップショットを持つバックエンドを提供します。 -
に新しいキーワード引数
allow_unknown_parametersを追加。ParameterExpression.bind()とParameterExpression.subs()メソッドに追加された。 この新しい引数を設定すると、これらのメソッドに未知のパラメータを含む辞書を渡してもエラーが発生しなくなる。 以前は、この動作を無効にする方法がなく、常にエラーが発生していた。 -
メソッドの
BaseEstimator.run()メソッドの引数observablesは、すでに受け付けられている他の型に加えて、strまたはstrの一連の入力型を受け付けるようになった。 オブジェクトのコンストラクタが受け付けるパウリ文字列表現と一致しなければならない。Pauliオブジェクトの -
新しいコンストラクタ・メソッド
QuantumCircuit.from_instructions()メソッドを追加した。QuantumCircuitオブジェクトを作成できる新しいコンストラクタ・メソッドを追加しました。 例:from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit.circuit.quantumcircuitdata import CircuitInstruction from qiskit.circuit import Measure from qiskit.circuit.library import HGate, CXGate qr = QuantumRegister(2) cr = ClassicalRegister(2) instructions = [ CircuitInstruction(HGate(), [qr[0]], []), CircuitInstruction(CXGate(), [qr[0], qr[1]], []), CircuitInstruction(Measure(), [qr[0]], [cr[0]]), CircuitInstruction(Measure(), [qr[1]], [cr[1]]), ] circuit = QuantumCircuit.from_instructions(instructions) circuit.draw("mpl")
-
この
Cliffordクラスは、コンストラクタでオプションのcopyキーワード引数を取るようになりました。Falseに設定すると、入力として与えられたStabilizerTableはコピーされず、直接使用される。 テーブルのデータが他の手段で変更されることがないのであれば、これはパフォーマンス上有益である。 -
の性能は
Clifford.compose()はすべての量子ビット数で大幅に改善された。 20量子ビットの演算子では、100倍のスピードアップとなる。 -
新しい合成機能を追加
synth_clifford_layers()合成関数Cliffordをレイヤーに合成する アルゴリズムはSに基づいている。 Bravyi、D. Maslov、Hadamard-free circuits expose the structure of Clifford group、 arxiv:2003.09412. これにより、クリフォードは2層のCZゲートと1層のCXゲートを含む8層のゲートに分解される。 例えば、5量子ビットのクリフォード回路は以下のレイヤーに分解される:┌─────┐┌─────┐┌────────┐┌─────┐┌─────┐┌─────┐┌─────┐┌────────┐ q_0: ┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├┤0 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_1: ┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├┤1 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_2: ┤2 S2 ├┤2 CZ ├┤2 CX_dg ├┤2 H2 ├┤2 S1 ├┤2 CZ ├┤2 H1 ├┤2 Pauli ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_3: ┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├┤3 ├ │ ││ ││ ││ ││ ││ ││ ││ │ q_4: ┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├┤4 ├ └─────┘└─────┘└────────┘└─────┘└─────┘└─────┘└─────┘└────────┘この方法により
Cliffordを2qubitの深さで 。 -
いくつかの標準ライブラリ・ゲート・クラスの
power()メソッドの戻り値の型が更新され、より特定のゲート・オブジェクトを返すようになりました。 例えばpower()を実行するとIGateインスタンスを返すようになった。UnitaryGateの代わりにインスタンスを返すようになった。改善された出力タイプの全リストは以下の通り:
-
を内部的に表現している。
EquivalenceLibraryは内部的にPyDiGraphとして表現されるようになった。graph属性からアクセスできる。 この属性はQiskit内部で使用されることを意図しているため、内部等価グラフの破損の可能性を防ぐために、ユーザーによって変更される前に常にコピーされるべきである。 -
コンストラクタの
Operator.from_circuit()コンストラクタ・メソッドは、トランスパイラのルーティング/スワップ・マッピング・ステージによって引き起こされた出力の並べ替えを逆にするようになった。 デフォルトでは、トランスパイルされた回路にSwapゲートが挿入されていた場合、出力行列はその順列が反転されるため、返される行列はトランスパイルされていない元の回路と等しくなります。 このデフォルトの動作を無効にしたい場合は、ignore_set_layoutキーワード引数をTrueに設定することで、これを行うことができます(トランスコンパイルによる初期レイアウトを無視する従来の動作に加えて)。 最終的なレイアウトを手動で設定したい場合は、新しいfinal_layoutキーワード引数を使用して、出力順列に使用するLayoutオブジェクトを渡すことができます。 -
トランスパイラー・パスに
GateDirectionを扱うトランスパイラ・パスのサポートを追加した。RXXGate,RYYGateおよびRZZGateゲートを扱えるようにした。 これでパスはこれらのゲートを正しく処理し、他の変更を加えることなくqargsの順序を単純に逆にする。 -
Python、指数演算子
**、オブジェクトでの使用がサポートされた。Gateオブジェクトの使用がサポートされました。 これはGate.power()メソッドを実行することと同じである。例:
from qiskit.circuit.library import XGate sx = XGate() ** 0.5 -
モジュールに新しいパルス形状
GaussianSquareDragを追加。qiskit.pulse.libraryモジュールに追加した。 このパルス形状はGaussianSquareに似ているがDrag形状を使用する。 DRAGパルス形状による補正は、パルスの立ち上がりと立ち下がりの周波数スペクトルの一部を抑制することができ、パルスの駆動周波数と周波数が近い場合に励起される量子ビットを回避するのに役立ちます。 -
のコンストラクタに新しいキーワード引数
methodを追加。FiniteDiffEstimatorGradientおよびFiniteDiffSamplerGradientクラスのコンストラクタに新しいキーワード引数method引数は、勾配に使用する計算方法を示す文字列を受け付ける。"central"、"forward"、"backward"の3つの方法がある。 メソッドの定義は以下の通り:メソッド計算"central""forward""backward"ここで、 はオフセットのイプシロンである。
-
のすべてのグラデーション・クラスは、パラメータ化されていない操作を保持するようになった。
qiskit.algorithms.gradientsのすべての勾配クラスは、パラメータ化されていない演算を保持するようになった。 これにより、個々のプリミティブが扱えるカスタムで不透明なゲート上で勾配を評価することができ、勾配回路が構築された後も、最適化された合成とコンパイルのために高い抽象度を保つことができる。 -
を追加した。
TranslateParameterizedGatesパスが追加され、回路内のパラメータ化されたゲートだけを指定された基底にマップし、パラメータ化されていないゲートはそのままにすることができるようになった。 このパスでは、まずアンロールを試み、パラメータ化されたゲートがそれ以上アンロールできない場合に最終的にトランスレートする。 -
トランスパイラー
CollectCliffordsトランスパイラー・パスは、"クリフォード・ゲート "のブロックを収集し、オブジェクトに結合するように拡張された。Cliffordここで、"クリフォードゲート "には、以下の型のオブジェクトも含まれる。LinearFunction,CliffordとPauliGate. 例:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import LinearFunction, PauliGate from qiskit.quantum_info.operators import Clifford from qiskit.transpiler.passes import CollectCliffords from qiskit.transpiler import PassManager # Create a Clifford cliff_circuit = QuantumCircuit(2) cliff_circuit.cx(0, 1) cliff_circuit.h(0) cliff = Clifford(cliff_circuit) # Create a linear function lf = LinearFunction([[0, 1], [1, 0]]) # Create a pauli gate pauli_gate = PauliGate("XYZ") # Create a quantum circuit with the above and also simple clifford gates. qc = QuantumCircuit(4) qc.cz(0, 1) qc.append(cliff, [0, 1]) qc.h(0) qc.append(lf, [0, 2]) qc.append(pauli_gate, [0, 2, 1]) qc.x(2) # Run CollectCliffords transpiler pass qct = PassManager(CollectCliffords()).run(qc)すべてのゲートが集められ、1つにまとめられる。
Clifford. こうして、最終的な回路は1つのオブジェクトで構成される。Cliffordオブジェクトで構成される。 -
CouplingMapの出力を反復するのと同じである。CouplingMap.get_edges(). 言い換えれば、"忖度 "である、from qiskit.transpiler import CouplingMap coupling = CouplingMap.from_line(3) list(coupling) == list(coupling.get_edges())が期待通りに機能するようになった。 これは純粋に構文上の便宜である。
-
新しい関数
synth_cnot_count_full_pmh()この関数は、Patel、Markov、Hayesの各手法を使用して、全対全アーキテクチャ用の線形可逆回路を合成するために使用されます。 この関数は、利用可能なqiskit.transpiler.synthesis.cnot_synth()関数と同じですが、より分かりやすい名前を持っており、パッケージツリーにより論理的に配置されています。 この新しい関数は、おそらく将来のリリースで非推奨となるであろうレガシー関数に取って代わるものである。 -
InstructionScheduleMapは、バックエンドのキャリブレーションデータを PulseQobj JSON形式で保存し、データが初めてアクセスされたときに変換を呼び出す、つまり遅延変換を行うように更新されました。 この内部ロジックの更新により、特に多くの検量線エントリーを持つバックエンドのロードパフォーマンスが劇的に改善されました。 -
新しいモジュール
qiskit.pulse.calibration_entriesが追加されました。 これは、異なるパルス・スケジュール表現のためのいくつかのラッパークラスを含んでいます。ScheduleDefCallableDefPulseQobjDef
これらのクラスは、それぞれパルススケジュールと割り当てるパラメータ名を返す
get_schedule()とget_signature()メソッドを実装しています。 これらのクラスはInstructionScheduleMapまたはバックエンドTargetによって内部的に管理されるため、一般的なユーザ・プログラムには表示されません。 -
のサブクラスとして、新しいサブクラス
ScalableSymbolicPulseを導入した。SymbolicPulse. 新しいサブクラスはSymbolicPulseただし、パルスのエンベロープが 形式の複素振幅前係数を含むと仮定します。このエンベロープ形状は、Qiskit Pulseライブラリのすべてのパルスを含む、多くの一般的なパルスにマッチします(このリリースでは、amp,angle表現にも変換されました)。新しいサブクラスは、
amp、angle表現の非一意性を取り除き、複素振幅に従ってパルスを正しく比較する。 -
メソッドに新しいキーワード引数
dtypeを追加。PauliSumOp.from_list()メソッドに追加した。 この引数を指定すると、構築された配列が内部的に使用するnumpy配列のdtype。SparsePauliOpが内部的に使用するPauliSumOp. -
Qiskit に OpenQASM 3 プログラムをインポートするためのサポートが追加されました。 これは、関数
qasm3.loads()とqasm3.load()関数を使って、それぞれ文字列から直接プログラムをロードしたり、ファイル名から間接的にロードしたりすることができる。 例えば、こんなことができるようになった:from qiskit import qasm3 circuit = qasm3.loads(""" OPENQASM 3.0; include "stdgates.inc"; qubit q; qubit[5] qr; bit c; bit[5] cr; h q; c = measure q; if (c) { h qr[0]; cx qr[0], qr[1]; cx qr[0], qr[2]; cx qr[0], qr[3]; cx qr[0], qr[4]; } else { h qr[4]; cx qr[4], qr[3]; cx qr[4], qr[2]; cx qr[4], qr[1]; cx qr[4], qr[0]; } cr = measure qr; """)これでプログラムは
QuantumCircuitcircuitインスタンスにロードします。Qiskit にはまだ高度な古典的データ処理を表現する方法がないため、最初は OpenQASM 3 のすべての機能がサポートされているわけではない。 輸入業者の能力は、Qiskitの他の部分の能力とともに向上する。 インポーターの初期特徴セットは、エクスポーターが出力する特徴セットとほぼ同じである(
qasm3.dump()とqasm3.dumps()).Qiskitが OpenQASM 3をサポートするのは、sを完全にロスレスで表現するためではないことに注意。
QuantumCircuits. そのためにはqiskit.qpy. -
によって定義された
primitives-で定義される勾配クラスに基づく。BaseEstimatorGradientおよびBaseSamplerGradient抽象クラスによって定義されたベース・グラデーション・クラスが更新されました。_preprocess()、_postprocess()、_run_unique()の3つの新しい内部オーバーライド可能メソッドがある。_preprocess()_postprocess、出力結果をカスタマイズすることができる。、ユニークなパラメータを持つ回路の勾配を計算することができる。_run_unique -
トランスパイラー・パスは
SabreLayoutトランスパイラー・パスはRustで書き直されたため、パフォーマンスが大幅に向上した。 この書き換えの一環として、パスは解析パスから、レイアウトとルーティングの両方を実行する変換パスに変更された。 これは、実行時のパフォーマンスを向上させるだけでなく、結果の質を向上させるために行われた。 手動でrouting_pass引数を設定するか、新しいskip_routing引数を使用することで、分析パスとしての以前の機能を保持することができる。 -
トランス
SabreLayoutトランスパイラー・パスは、新しいコンストラクター引数layout_trialsを持つ。 この引数は、乱数ジェネレーターの種をいくつ使用するかを制御するために使用される。SabreLayoutを指定します。 設定すると、SABREレイアウト・アルゴリズムがlayout_trials回実行され、最も品質の高い出力(スワップ・ゲートの追加数が最も少ないことで測定)が選択される。 これらのシードトライアルは、レイアウトを複数回実行することによる潜在的なパフォーマンスオーバーヘッドを最小化するために、マルチスレッドを使って並列実行される。 デフォルトでは、これを指定しないとSabreLayoutパスのデフォルトは、ローカルシステムで利用可能な物理 CPU の数を使用する。 -
新しいクラスを2つ追加
SciPyRealEvolverとSciPyImaginaryEvolverを追加しました。 観測値の値と標準偏差、およびそれらが評価される時間は、次のように問い合わせることができる。TimeEvolutionResult.observablesそしてTimeEvolutionResult.times. 例:from qiskit.algorithms.time_evolvers.time_evolution_problem import TimeEvolutionProblem from qiskit.quantum_info import SparsePauliOp from qiskit.quantum_info.states.statevector import Statevector from qiskit.algorithms import SciPyImaginaryEvolver initial_state = Statevector.from_label("+++++") hamiltonian = SparsePauliOp("ZZZZZ") evolution_problem = TimeEvolutionProblem(hamiltonian, 100, initial_state, {"Energy":hamiltonian}) classic_evolver = SciPyImaginaryEvolver(num_timesteps=300) result = classic_evolver.evolve(evolution_problem) print(result.observables) -
を追加。
SolovayKitaev離散ゲートセットを使用した1量子ビットユニタリー近似のためのSolovay-Kitaevアルゴリズムを実行するトランスパイラーパスを追加。 基底変換器と組み合わせることで、あらゆるユニタリー回路を、フォールト・トレラントに実装可能なユニバーサル離散ゲートセットに変換することができる。このパスは、例えば、UゲートやCXゲートにコンパイルした後に使うことができる:
from qiskit import transpile from qiskit.circuit.library import QFT from qiskit.transpiler.passes.synthesis import SolovayKitaev qft = QFT(3) # optimize to general 1-qubit unitaries and CX transpiled = transpile(qft, basis_gates=["u", "cx"], optimization_level=1) skd = SolovayKitaev() # uses T Tdg and H as default basis discretized = skd(transpiled) print(discretized.count_ops())この分解は、ユニタリー合成プラグインでも使用できる。
UnitarySynthesisトランスパイラ・パスのfrom qiskit import QuantumCircuit from qiskit.quantum_info import Operator from qiskit.transpiler.passes import UnitarySynthesis circuit = QuantumCircuit(1) circuit.rx(0.8, 0) unitary = Operator(circuit).data unitary_circ = QuantumCircuit(1) unitary_circ.unitary(unitary, [0]) synth = UnitarySynthesis(basis_gates=["h", "s"], method="sk") out = synth(unitary_circ) out.draw('mpl')
-
によるランダム回路生成は
qiskit.circuit.random.random_circuit()によるランダム回路生成は、大規模な回路で大幅に高速化されました。 -
によるランダム回路生成
qiskit.circuit.random.random_circuit()はQiskitの回路ライブラリ(qiskit.circuit.library).これには2つの4量子ビットゲートC3SXGateとRC3XGatemax_operandsの許容値が拡張されました。 -
トランス
Optimize1qGatesDecompositionトランスパイラ・パスのコンストラクタには、新しいキーワード引数targetがある。 この引数はTargetオブジェクトを指定することができる。 使用する場合は、basisの引数を優先し、回路内の命令がターゲット・バックエンドに存在するかどうかを判断する。 -
トランス
UnrollCustomDefinitionsトランスパイラ・パスのコンストラクタには、新しいキーワード引数targetがある。 この引数はTargetオブジェクトを指定することができる。 使用する場合は、basis_gatesの引数を優先し、回路内の命令がターゲット・バックエンドに存在するかどうかを判断する。 -
を追加した。
ReverseEstimatorGradientクラスが追加され、バックプロパゲーションまたはリバースモード勾配に基づく期待値勾配の古典的な高速評価が可能になった。 このクラスは状態ベクトルを使用するため、正確な勾配が得られるが、システム・サイズが指数関数的に大きくなる。 これは、より小さなシステム・サイズの高速リファレンス計算用に設計されている。 例えば、次のように使うことができる:from qiskit.circuit.library import EfficientSU2 from qiskit.quantum_info import SparsePauliOp from qiskit.algorithms.gradients import ReverseEstimatorGradient observable = SparsePauliOp.from_sparse_list([("ZZ", [0, 1], 1)], num_qubits=10) circuit = EfficientSU2(num_qubits=10) values = [i / 100 for i in range(circuit.num_parameters)] gradient = ReverseEstimatorGradient() result = gradient.run([circuit], [observable], [values]).result() -
クラスのコンストラクタに新しいキーワード引数
use_dag。OneQubitEulerDecomposerクラスのコンストラクタにuse_dagをTrueに設定すると、デコンポーザーからの出力はDAGCircuitオブジェクトになる。QuantumCircuitオブジェクトになる。 を使用するトランスパイラ・パスに便利です。OneQubitEulerDecomposer(例えばOptimize1qGatesDecompositionを使うトランスパイラ・パスに便利です。DAGCircuitとの間で変換するオーバーヘッドを回避できるからです。QuantumCircuitとDAGCircuit. -
分析パスで
VF2LayoutおよびVF2PostLayoutトランスパイラ・パスに 分析パスがプロパティセットにvf2_avg_error_mapキーを設定した場合、その値はバックエンドのTarget(またはBackendPropertiesの場合はBackendV1). 値はErrorMapインスタンスであるべきで、各値はそれらの量子ビットのすべての1または2量子ビット操作の平均エラーレートを表す。 値がNaNの場合、対応するエッジは理想的なエッジ(または 1q 操作のための量子ビット)として扱われる。 例えば、エラー・マップは次のように作成される:from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032)1q
0.00240.0032(0,1)で動作するゲートの平均 2q エラー率は 0.01、(1,0)はターゲットでサポートされていない。 これは、vf2_avg_error_mapキーが設定されている場合、採点に使用されます。VF2LayoutとVF2PostLayoutが実行されたときに 例:from qiskit.transpiler import AnalysisPass, PassManager, Target from qiskit.transpiler.passes import VF2Layout from qiskit.transpiler.passes.layout.vf2_utils import ErrorMap from qiskit.circuit.library import CZGate, UGate from qiskit.circuit import Parameter class CustomVF2Scoring(AnalysisPass): """Set custom score for vf2.""" def run(self, dag): error_map = ErrorMap(3) error_map.add_error((0, 0), 0.0024) error_map.add_error((0, 1), 0.01) error_map.add_error((1, 1), 0.0032) self.property_set["vf2_avg_error_map"] = error_map target = Target(num_qubits=2) target.add_instruction( UGate(Parameter('theta'), Parameter('phi'), Parameter('lam')), {(0,): None, (1,): None} ) target.add_instruction( CZGate(), {(0, 1): None} ) vf2_pass = VF2Layout(target=target, seed=1234568942) pm = PassManager([CustomVF2Scoring(), vf2_pass])これは
VF2Layouterror_map、2量子ビットのカスタムスコアで実行されます。Targetで実行されます。
アップグレードの注意
-
のパルス・クラスのいずれかを初期化するとき
qiskit.pulse.library:複素数
ampの引数に有限angleを与えると、次のようになる。PulseErrorになる。 例えば、Gaussian(duration=100,sigma=20,amp=0.5j)と呼ぶ代わりに、Gaussian(duration=100,sigma=20,amp=0.5,angle=np.pi/2)と呼ぶべきだ。 これまでamp * ...と定義されていたパルスエンベロープは、amp * exp(1j * angle) * ...と定義される。 この変更は、パルスの振幅と角度が別々の実験で校正される Qiskit実験をよりよくサポートするために行われた。 -
Python 3.7 singledispatchmethodが依存関係になった。 これは、 Python の新しいバージョンの標準ライブラリのメソッドディスパッチ機構を活用できるようにするために追加された。 Python >= 3.8 であれば、追加の依存関係は必要ない。
-
以前は非推奨だった
MSBasisDecomposer。qiskit.transpiler.passesモジュールは削除されました。 これはもともとQiskit Terra 0.16.0 リリース(10-16-2020)の一部として非推奨となったものです。 代わりにBasisTranslatorを持つ適切な基底に回路を変換するために、トランスパイラ・パスを代わりに使うべきである。RXXGate -
EquivalenceLibrarybase属性で初期化されたオブジェクトは、渡されたEquivalenceLibraryとの共有参照はなくなります。 以前のリリースでは、新しいインスタンスを作成するためにbase。EquivalenceLibraryインスタンスの両方にその変更が反映されます。 これはもはや事実ではなく、baseのアップデートは新しいEquivalenceLibrary. 例えば、等価ライブラリーを以下のように作成したとする:import math from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.circuit.equivalence import EquivalenceLibrary original_lib = EquivalenceLibrary() qc = QuantumCircuit(1) qc.rx(math.pi, 0) original_lib.add_equivalence(XGate(), qc) new_lib = EquivalenceLibrary(base=original_lib)で
original_lib:import from qiskit.circuit.library import SXGate qc = QuantumCircuit(1) qc.rx(math.pi / 2, 0) original_lib.add_equivalence(SXGate(), qc)以前のリリースでは、
new_libは、original_libに追加された後、SXGateの定義も含んでいたが、今回のリリースではそうではない。 この変更は、内部データ構造をグラフに変更したためである。EquivalenceLibraryクラスのパフォーマンスが向上したためです。BasisTranslatorトランスパイラ・パスを複数回実行した場合に特に。 -
クラスのコンストラクタの
initial_state引数は、 属性に直接代入する場合と同様に、 属性でなければならない。NLocalクラスのコンストラクタの引数は、NLocal.initial_state属性に直接代入するのと一緒にQuantumCircuitでなければならない。 この引数および属性に他の型を使用するサポートは終了しました。 その他の型のサポートは、Qiskit Terra 0.18.0 リリース(2021年7月)の一部として非推奨となった。 -
LaTeX 配列ドロワー(例:
array_to_latex、Statevector.draw('latex'))は、ケット規約ドロワーと同じsympy関数を使用するようになった。 これは、以前のリリースとは異なる数値が表示される可能性があることを意味するが、より一貫したエクスペリエンスを提供する。 例えば、新たな因子を特定したり、以前にはなかった分母を合理化したりする。 デフォルトのprecisionが5から10に変更された。 -
が発するQPYバージョン・フォーマットのバージョンは、バージョン6に引き上げられた。
dump()はバージョン6に増加した。 この新しいフォーマットのバージョンは以前のバージョンと互換性がなく、QPYバージョン6を扱えないデシリアライザーでロードしようとするとエラーになる。class_name_sizeこの変更は、ScalableSymbolicPulseの導入に対応するために必要だった。SymbolicPulseオブジェクトのヘッダーに -
の
__hash__メソッドが削除された。SymbolicPulseのメソッドは削除された。 これは、このクラスの(パラメータ割り当てによる)変更可能な性質を反映するためである。SymbolicPulseを使うとエラーになる可能性があったためです。 つまり、組み込みのhash()メソッドや、キーとしてSymbolicPulseを辞書やセット・メンバーのキーとして使うことはできなくなります。 -
インスタンス名
Registerインスタンスの名前(これにはQuantumRegisterやClassicalRegigsterのインスタンスも含む) は、もはや有効な OpenQASM 2 識別子に制約されない。 これは、Qiskitが OpenQASM 2からより切り離され、 OpenQASM 3仕様でさえそれほど制限されていないため、制限が厳しすぎるとして行われている。 有効な OpenQASM 2識別子名を持つレジスタに依存していた場合、名前をエスケープする必要がある。 これを単純化すると、例えば次のようになる:import re import string def escape(name: str) -> str: out = re.sub(r"\W", "_", name, flags=re.ASCII) if not out or out[0] not in string.ascii_lowercase: return "reg_" + out return out -
メソッド
QuantumCircuitメソッドu1,u2,u3, およびそれらの制御された亜種cu1,cu3,mcu1は、 Qiskit Terra 0.16.0 で非推奨となったため削除されました。 これは、通常 IBM -特有のゲート名を削除し、より一般的なメソッドを採用するためである。p(),u(),cp()とcu(). ゲートクラスU1Gate,U2GateおよびU3GateはまだQuantumCircuit.append()そのため、バックエンドはこれらのゲートを明示的に指定したベースをサポートすることができます。 -
メソッドは削除されました。
QuantumCircuitメソッドcombineとextendは、Qiskit Terra 0.17.0 で非推奨となったため、削除されました。 これは、これらの関数が単にQuantumCircuit.compose()であるためである。extendが削除されたことは、+と+=の演算子も定義されなくなったことを意味する。QuantumCircuit. 代わりに、&と&=演算子を使うことができます。QuantumCircuit.compose(). -
以前は非推奨だった関数:
qiskit.circuit.measure.measure()とqiskit.circuit.reset.reset()は削除された。 これらの関数はQiskit Terra 0.19.0 リリース(2021年12月)で非推奨となりました。 代わりにQuantumCircuit.measure()とQuantumCircuit.reset()メソッドを使うべきです。QuantumCircuitオブジェクトのMeasureまたはResetメソッドを使うべきである。 -
これまで
setから継承されていた非推奨のParameterViewメソッドはParameterViewから削除されました。QuantumCircuit.parameters. 削除された具体的な方法は以下の通り:add()difference()difference_update()discard()intersection()intersection_update()issubset()issuperset()symmetric_difference()symmetric_difference_update()union()update()
Python :
ixor:^=isub:-=ior:|=
これらはQiskit Terra 0.17.0 リリース(2021年4月)で非推奨となった。
ParameterView型は現在、一般的なシーケンス・ビュー型であり、これらのset操作はサポートされていない。 -
以前は非推奨だった NetworkX コンバータメソッド
DAGCircuitとDAGDependencyクラスのコンバータ・メソッドは削除されました:DAGCircuit.to_networkx()DAGCircuit.from_networkx()およびDAGDependency.to_networkx()の変換メソッドは削除されました。 これらのメソッドはもともと、Qiskit Terra 0.21.0 リリース(2022年6月)の一部として非推奨とされていました。 Qiskitは、qiskit-terra 0.12.0 リリース以来、グラフライブラリとして rustworkxを使用しており、それ以来、 NetworkX コンバータ関数はロッシー処理となっている。 これらはもともと、ユーザーが NetworkX’s アルゴリズム・ライブラリを活用してDAGCircuitやrustworkxにはない機能を利用するために追加された。 しかし、それ以来DAGCircuitとrustworkxは成熟し、より多くの機能を提供するようになった。DAGCircuitはrustworkxと緊密に結合して動作しており、これらのコンバーター・メソッドは限られた機能しか提供しないため、削除された。 -
tweedledumはQiskit Terraのコア要件として削除された。 提供されている機能 (qiskit.circuit.classicalfunction)は、tweedledumを手動でインストールした場合などにも利用可能である:pip install tweedledumこの変更は、
tweedledumの開発が新しい Python や OS のリリースに追いつかないほど遅くなり、一部の Qiskit ユーザーが Qiskit をインストールするのを妨げていたためです。 -
怠惰なオプショナル・チェッカー
HAS_MATPLOTLIB,HAS_PIL,HAS_PYLATEXおよびHAS_PDFTOCAIROはもはやqiskit.visualizationQiskit Terra 0.21 で非推奨となりました。 これら(および他の多くの遅延チェッカー)の標準的な場所はqiskit.utils.optionalsで、4つのオブジェクトはすべてそこにある。 -
のコンストラクタへの
gate引数が削除されました。Decomposeトランスパイラ・パスのコンストラクタへの引数、およびそれにマッチする属性Decompose.gateは削除されました。 この引数と属性は、Qiskit Terra 0.19.0 リリース(2021年12月)の一部として非推奨となりました。 代わりに、コンストラクタの引数gates_to_decompose、Decompose.gates_to_decompose属性を使用する。gates_to_decomposeの引数と属性は同じように機能するはずだが、より明示的な名前を持ち、単一のゲートだけをサポートするのではなく、ゲートのリストを指定することもできる。 -
のコンストラクタの
label引数は、以前は非推奨だった。MCMTとMCMTVChainクラスのコンストラクタの引数は削除されました。 Qiskit Terra 0.19.0 リリース(2021年12月)時点で非推奨となりました。 のサブクラスであるため、これらのクラスでlabel。QuantumCircuitではなくInstruction. その結果、割り当てられたラベルは一般的に無視されることになる。 のインスタンスにlabel。MCMTまたはMCMTVChainのインスタンスに割り当てる必要がある場合はGateインスタンスに変換してto_gate()でインスタンスに変換しlabel属性に割り当てます。 例:from qiskit.circuit.library import MCMT, XGate mcmt_circuit = MCMT(XGate(), 3, 2) mcmt_gate = mcmt_circuit.to_gate() mcmt_gate.label = "Custom MCMT X" -
Qiskit 用の
retworkx依存関係は削除され、rustworkxライブラリに置き換えられました。 これらは同じパッケージだが、rustworkxはretworkxの新しい名前で、 0.12.0 のリリースの一部として名前が変更された。 以前Qiskitでretworkx 0.12.0 を使用していた場合、すでにrustworkxがインストールされています(retworkx 0.12.0 は後方互換性のための単なるリダイレクトシムでした)。 この変更は、今後サポートされる唯一のパッケージとなる新しいパッケージ名に移行するために行われました。 -
コンパイラー・パスのデフォルト動作
SabreLayoutコンパイラパスのデフォルトの動作が変更されました。 パスはもはやAnalysisPassデフォルトでは、初期レイアウトを計算し、それを回路に適用します。SabreSwapを内部的に実行し、スワップ・マッピングを適用し、スワップ挿入による順列でfinal_layoutプロパティを設定します。 つまりSabreLayoutをカスタムPassManagerの引数routing_passを設定している場合を除く)。SabreLayout). レイアウトとルーティングの品質は高度に連関している。SabreLayoutどのシードが最良の結果をもたらすかを計算するためには、レイアウトとルーティングの両方を一緒に実行する必要があります。 カスタムパスマネージャーで使用量を調整するには3つの方法があります。 一つ目は、プリセット・パス・マネージャーでエンベッディングを使わないこと。 もしあなたが以前、次のようなことをやっていたとしたら:from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map) pm += common.generate_embed_passmanager(coupling_map)レイアウトを計算し、それを適用する(これは通常、ルーティングに続いて行われる):
from qiskit.transpiler import PassManager from qiskit.transpiler.preset_passmanagers import common from qiskit.transpiler.passes.SabreLayout pm = PassManager() pm.append(SabreLayout(coupling_map)として
SabreLayoutを実行するとレイアウトが適用され、埋め込みステージは必要なくなります。 あるいは、routing_pass引数を指定することもできる。SabreLayoutに戻る。 例えばSabreLayoutを以前のリリースと同じように実行したい場合は、次のようにすることができる:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)これは
SabreLayoutを分析パスとして実行し、layoutプロパティセットを設定するだけである。 最後のアプローチは、SabreLayoutのskip_routing引数を活用することである。この引数をTrueに設定すると、見つかったレイアウトの適用と配線からのスワップ・ゲートの挿入がスキップされる。 しかし、SabreLayout、ルーティングを計算することに変わりはなく、このデータを使用しないだけであるため、これを行うとランタイムペナルティが発生する。 最初に説明した2つのアプローチには、追加的なオーバーヘッドはない。 -
によって計算されたレイアウトは、以前のリリースから変更される可能性があります。
SabreLayoutパスで計算されたレイアウトは(routing_pass引数を指定せずに実行した場合)、以前のリリースと変更される可能性があります。 の書き換えの一環として新しい乱数ジェネレーターが使用されたためである。SabreLayoutパスの書き換えの一環として新しい乱数生成器が使われたためである。 一貫性のある出力に依存する場合は、以前のバージョンのQiskitでパスを実行し、回路を保存してから現在のバージョンでロードするためにqiskit.qpyを活用して回路を保存し、現在のバージョンでロードすることができます。routing_passのインスタンスに明示的に設定することもできる。SabreSwapのインスタンスに設定することもできる。SabreLayout:from qiskit.transpiler.passes import SabreSwap, SabreLayout routing_pass = SabreSwap( coupling_map, "decay", seed=seed, fake_run=True ) layout_pass = SabreLayout(coupling_map, routing_pass=routing_pass, seed=seed)これは以前のリリースでのパスの動作を反映したものである。 以前のリリースで
swap_trials引数をSabreLayout引数trialsを設定する必要があることに注意してください。SabreSwap引数を設定する必要があります。 -
与えられたシードに対して
qiskit.circuit.random.random_circuitが返す正確な回路が変更された。 これは、関数内部の乱数生成の効率化によるものである。 -
pip install qiskit-terra[toqm]からインストール可能なオプション機能パッケージqiskit-toqmのバージョン要件が、バージョン0.0.4から0.1.0にアップグレードされました。 でtoqmルーティングメソッドを使用するにはtranspile()を使用するには、qiskit-toqm バージョン0.1.0以降を使用する必要があります。 古いバージョンはトランスパイラで検出できなくなった。 -
出力
QuasiDistributionSampler.runの出力が更新され、確率がゼロの状態がフィルタリングされた。 辞書の出力から有効な状態が欠落している場合、その確率は0であると仮定できる。 以前は、ある状態の確率が0であったとしても、与えられたビット数(例えば、3ビットの結果の場合000,001,010,011,100,101,110,111)に対して起こりうるすべての結果を示していた。 この変更は、ビット数が大きいと出力サイズが非常に大きくなるため、出力サイズを小さくするために行われた。 また、確率ゼロの結果をフィルタリングすることで、他の実装のBaseSampler. -
が呼び出されたときのパルスビルダーの動作がアップグレードされました。
Scheduleが呼び出されたときのパルスビルダの動作がアップグレードされました。 呼び出されたスケジュールは内部的にScheduleBlockによってラップされたスケジュールを追加するのではなく、常に参照メカニズムが適用されます。Call命令でラップされたスケジュールを追加するのではなく、常に参照メカニズムが適用されます。 変換されたブロックは、元のアライメント・コンテキストを回復する必要はないことに注意。 これは、絶対的な時間間隔を持つパルス命令のシーケンスをASAPで整列させただけのものである。 これは、呼び出されたパルス・プログラムの内部表現のアップグレードであり、APIの変更はない。 しかしCall命令とScheduleは、もはやビルダーのパルス・プログラムには現れない。 この変更により、生成されるスケジュールブロックは常にQPYと互換性があることが保証される。 によって出力スケジュールの指示をフィルタリングしている場合、以下のようにアクセスすることができます。Callでフィルタリングしている場合はScheduleBlock.referencesにアクセスすることができる。 -
RZXCalibrationBuilderとRZXCalibrationBuilderNoEchoを生成するようにアップグレードされました。ScheduleBlock. この変更により、トランスパイルされた回路は常にQPY互換であることが保証される。 を直接使用している場合rescale_cr_inst()このメソッドはパルスビルダー・マクロになっており、新しいリリースに対応するためにはパルスビルダー・コンテキスト内でこのメソッドを使用する必要があります。 このメソッド呼び出しは、伸張されたパルスを持つ命令を返す代わりに、再生命令をコンテキストパルスプログラムに注入する。Play命令は返されない。
非推奨のメモ
-
Python 3.7 サポートでQiskitを実行するためのサポートは非推奨となり、qiskit-terra 0.25.0 リリースで削除される予定です。 つまり、 0.25.0 リリースから、使用している Python バージョンを Python 3.8 以上にアップグレードする必要があります。
-
クラス
LinearFunctionsSynthesisクラスは現在非推奨となっており、将来のリリースで削除される予定です。 このクラスは、より一般的なHighLevelSynthesisクラスに取って代わられた。 のインスタンスをインスタンス化することができる。HighLevelSynthesisLinearFunctionSynthesisのインスタンスをインスタンス化することができます:from qiskit.transpiler.passes import HighLevelSynthesis from qiskit.transpiler.passes.synthesis.high_level_synthesis import HLSConfig HighLevelSynthesis( HLSConfig( linear_function=[("default", {})], use_default_on_unspecified=False, ) ) -
関数に引数値のリストを渡すサポートは廃止予定です。
transpile()関数に引数値のリストを渡すサポートは非推奨であり、 0.25.0 リリースで削除される予定です。 これは、複数の回路を一度にトランスパイルする際の並列実行のオーバーヘッドを大幅に削減するために行われている。 現在この機能を使用している場合は、代わりにtranspile()を複数回呼び出すことができます。 例えば、以前はこんなことをしていたとする:from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = transpile([qc] * 6, coupling_map=cmaps)代わりに、次のようなものを実行する必要がある:
from itertools import cycle from qiskit.transpiler import CouplingMap from qiskit import QuantumCircuit from qiskit import transpile qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() cmaps = [CouplingMap.from_heavy_hex(d) for d in range(3, 15, 2)] results = [] for qc, cmap in zip(cycle([qc]), cmaps): results.append(transpile(qc, coupling_map=cmap))を活用することもできる。
parallel_map()または Python 標準ライブラリのmultiprocessingを利用することもできる。 -
qiskit.visualization.pulseに存在するレガシーバージョンのパルスドローワーは非推奨であり、将来のリリースで削除される予定である。 これにはScheduleDrawerと :class`WaveformDrawer` クラスが含まれる。 このモジュールは、qiskit.visualization.pulse_v2引出しに取って代わられ、典型的なユーザーAPIpulse_drawer()とPulseBlock.draw()はすでに内部的にqiskit.visualization.pulse_v2を使うように更新されている。 -
pulse.Instruction.draw()メソッドは非推奨となり、将来のリリースでは削除される予定です。 このメソッドの必要性は、qiskit.visualization.pulse_v2のドロワーに取って代わられた。このドロワーでは、Instrucionオブジェクトが独自の draw メソッドを持つ必要はない。 パルス命令を描画する必要がある場合は、代わりにpulse_drawer()代わりに -
QPYがトップレベルに昇格したため、インポート
qiskit.circuit.qpy_serializationは非推奨。 同じオブジェクトをqiskit.qpyからインポートすべきである。 古いパスは、将来のQiskit Terraで削除される。 -
qiskit.IBMQオブジェクトは非推奨。 このエイリアス・オブジェクトは、属性へのアクセスをqiskit.providers.ibmq.IBMQにリダイレクトする。qiskit-ibmq-providerパッケージは、独自の名前空間を維持するqiskit-ibm-providerパッケージに取って代わられたため、このエイリアスを維持することは、新しいパッケージではもはや意味をなさない。qiskit.IBMQのエイリアスに依存していた場合は、代わりにqiskit.providers.ibmq.IBMQを直接使用するように使用方法を更新する必要があります(また、qiskit-ibm-providerへの移行も検討してください。詳細は移行ガイドを参照してください)。 -
パルスQobjコンバータのいくつかのパブリック・メソッドは非推奨となり、将来のリリースでは直接呼び出せなくなります。 メソッドのリストは以下の通り:
InstructionToQobjConverter、convert_acquire()convert_bundled_acquires()convert_set_frequency()convert_shift_frequency()convert_set_phase()convert_shift_phase()convert_delay()convert_play()convert_snapshot()
QobjToInstructionConverter、convert_acquire()convert_set_phase()convert_shift_phase()convert_set_frequency()convert_shift_frequency()convert_delay()bind_pulse()convert_parametric()convert_snapshot()
これらのメソッドを直接呼び出す代わりに、コンバーターのインスタンスが直接呼び出されたときに暗黙的に選択される。 例:
converter = QobjToInstructionConverter() converter(pulse_qobj) -
qiskit.visualization.state_visualization.num_to_latex_ket()とqiskit.visualization.state_visualization.num_to_latex_terms()関数は非推奨となり、将来のリリースで削除される予定です。 これらの関数は、主に LaTeX からの出力によって内部的に使用されていた。Statevector.draw()とDensityMatrix.draw()の出力で主に内部的に使用されていたもので、現在はこれらの関数を使用しておらず、代わりに sympyを活用している。 これらの関数を使用していた場合は、Sympy の nsimplify() latex() 関数を使用することをお勧めします。 -
Register.qasm()メソッドは非推奨であり、将来のリリースで削除される予定である。 このメソッドは、サブクラスQuantumRegisterとClassicalRegister. この非推奨は、qasm()メソッドが、 OpenQASM 2への安全な変換の責任者についての誤った見方を助長するためである。単一のオブジェクトだけでは、有効な識別子を生成するためにエスケープした後にその名前が衝突するかどうかといった、安全な変換を提供するためのコンテキストを持たない。 -
クラス変数正規表現
Register.name_formatは非推奨であり、将来のリリースで削除される予定です。 レジスター名は、有効な Python 文字列であれば何でも許されるようになったので、正規表現はもう使えない。 -
関数
qiskit.quantum_info.synthesis.decompose_clifford()とqiskit.quantum_info.synthesis.decompose_cnot_dihedral()は非推奨であり、将来のリリースで削除される予定である。 これらの関数はqiskit.synthesis.synth_clifford_full()とqiskit.synthesis.synth_cnotdihedral_full()に置き換えられる。
バグ修正
-
メソッドの問題を修正しました。
PauliOp.adjoint()PauliOp(Pauli("iX"))メソッドで、複素数の係数を持つポーリスに対して正しい値を返してしまう問題を修正した。 修正 #9433。 -
qiskit.algorithms.amplitude_estimatorsモジュールの振幅推定アルゴリズム (amplitude_estimatorsを参照) の問題を修正しました。BaseSamplerプリミティブ(たとえばSamplerやBackendSampler). 以前は、測定結果が実際に測定されたビット数よりも多く拡張されていたため、1つ以上の量子ビットを持つオラクルでは、オラクルの "良い "量子状態の検出に誤差が生じる可能性があった。 -
QuantumCircuit.add_calibrations()とDAGCircuit.add_calibrations()メソッドで、パラメータ・フォーマット・ロジックの動作に不一致があった問題を修正。 これまでのDAGCircuit.add_calibrations()は、すべてのパラメーターをfloatにキャストしようとしていた。QuantumCircuit.add_calibrations()は、与えられたパラメーターをそのまま使っていた。 で実行すると、エラーを引き起こす可能性がある。transpile()これはQuantumCircuit較正のパラメーターがParameterExpresion。 -
QPYの(
qiskit.qpy)load()関数のデシリアライズ問題を修正した。MCXGate,MCXGrayCode,MCXRecursiveおよびMCXVChainを含む回路はデシリアライズに失敗する。 修正 #9390。 -
の問題を修正しました。
TensoredOp.to_matrix()演算子のグローバル係数が最終行列に複数回乗算される問題を修正しました。 これで、テンサードされた演算子やステートの数に関係なく、グローバル係数が正しく適用されるようになった。 修正 #9398。 -
メソッドからの出力は
run()メソッドからの出力はBackendSamplershotsstddev_upper_boundクラスのメソッドからの出力は、返されたQuasiDistribution. 以前は、これらの属性が欠落していたため、出力を使用したいくつかの後処理ができなかった。 修正 #9311 -
OpenQASM 2 エクスポーター・メソッド
QuantumCircuit.qasm()は、デフォルトでゲート・パラメータにより高精度の浮動小数点数を出力するようになりました。 さらに、与えられたパラメータが の分数/累乗に近いかどうかを確認する際に、より厳しい境界( )が使用されます。 #7166 を修正しました。 -
のサポートを修正した。
primitivesモジュールのサポートを修正した。QuantumCircuitオブジェクトの実行をサポートした。IfElseOp). 以前は、BaseSamplerとBaseEstimatorの基本クラスは、このような回路を正しく正規化できなかった。 しかし、これらの回路の実行は、制御フロー命令をサポートするプリミティブの特定の実装に依存する。 これは、BaseSamplerまたはBaseEstimatorの特定の実装が制御フロー命令を使用できるようにサポートを修正しただけである。 -
PauliOp.matmul()メソッドで、iIで正しくない結果を返す問題を修正した。 修正 #8680。 -
近似量子コンパイラ(
AQC)クラスで,入力ユニタリーが -1 の行列式を持っている場合に不正な回路を返してしまう問題を修正しました. 修正 #9327 -
メソッドの問題を修正しました。
QuantumCircuit.compose()メソッドが有効なqubitまたはclbit指定子を誤って拒否する問題を修正しました。 これは修正され、このメソッドは他のQuantumCircuitメソッドと同じappend(). 修正 #8691。 -
メソッドの問題を修正しました。
QuantumCircuit.compose()メソッドの問題を修正しました。 以前は、マッピングは非常に不正確で、各条件内で使用されるビットはマッピングの対象ではなく、代わりに対応するレジスタを見つける不正確な試みが行われていた。 これはまた、より小さなレジスタ上の条件が、より大きなレジスタ上に展開されることになりかねず、これは有効な変換ではない。 これで、1つのビットまたは1つのレジスタに対する条件は、clbitsの引数で定義されたビットに対して正確に構成されることになる。 必要であれば、これを容易にするために、新しいエイリアシング・レジスタがベース回路に追加される。 修正 #6583。 -
の問題を修正しました。
transpile()関数の問題を修正しました。optimization_levelを1,2, または3に設定し、backend,basis_gates, またはtargetの引数を指定せずに実行した場合。 入力回路に単純化できる単一量子ビットのゲートがあった場合、出力回路はそのような単一量子ビットのゲートが取り除かれていないため、可能な限り最適化されていないことになる。 以前は、backend、basis_gates、targetのいずれかの引数を呼び出し時に指定することで、これを修正することができた。transpile()のいずれかを指定することで修正できたが、現在では、許容されるターゲット・ゲートを知らなくても、出力はできる限り簡略化されたものになる。 9217を修正 -
の問題を修正しました。
transpile()関数をoptimization_level=3、引数backend、basis_gates、targetを指定せずに実行した場合の問題を修正しました。 もし入力回路に、同一行列と等価な2量子ビットブロックが含まれていれば、出力回路は可能な限り最適化されず、依然としてその同一ブロックを含むことになる。 以前は、backend、basis_gates、targetのいずれかの引数を呼び出し時に指定することで、これを修正することができた。transpile()のいずれかを指定することで修正できたが、現在では、許容されるターゲット・ゲートを知らなくても、出力はできる限り簡略化されたものになる。 9217を修正 -
の問題を修正した。
LinCombSamplerGradientで実行するとエラーが発生する可能性がある問題を修正しました。Samplerクラスをqiskit-aer。 -
の問題を修正した。
NumPyEigensolverおよびその拡張NumPyMinimumEigensolverで、Operator以外のBaseOperatorサブクラスを解くとエラーになる問題を修正した。 -
から出力されるメタデータで、リストが参照によってコピーを作成し、すべての要素が反復ごとに同じ値に更新されていた問題を修正した。
primitivesのメタデータ出力で、リストが参照によってコピーを作成し、すべての要素が反復ごとに同じ値で更新される問題を修正しました。 -
QobjToInstructionConverter、複数のバックエンドが呼び出され、それらが誤ってpulseライブラリで同じpulse名を持っていた場合の問題を修正。 これは、コンバーターのインスタンスが複数のバックエンドで再利用される場合にのみ発生するエッジケースだった(これは典型的な使用パターンではなかった)。 -
クラスの問題を修正した。
PVQDクラスの問題を修正しました。 これは、損失関数が元のアルゴリズム定義の定義と一致するように修正された。 -
QPY()のバグを修正。
qiskit.qpy)で、ビットが緩んだ後に回路内で発生するレジスタを含む回路がデシリアライズに失敗するバグを修正した。 9094を参照。 -
TwoQubitWeylDecompositionクラスはpickleプロトコルと互換性がある。 以前は、デシリアライズに失敗し、TypeError。 7312を参照。 -
メソッドの問題を修正しました。
LocalReadoutMitigator.quasi_probabilities()メソッドでshots引数が使われていなかった問題を修正した。 現在は、リターンオブジェクトのショット数を設定するために使用される。 -
の構築におけるリグレッションを修正した。
CliffordQuantumCircuits、他のCliffordオブジェクトを含む -
TwoQubitWeylDecompositionクラス(およびそのサブクラス)の問題を修正し、 Python 標準ライブラリpickleでこれらのクラスをシリアライズできるようにした。 これは #7312 を部分的に修正したものである -
QuantumCircuit.qasm()は、予約された OpenQASM 2 キーワードと衝突するゲート名やレジスタ名を正しくエスケープするようになった。 5043を修正。 -
の問題を修正した。
RZXCalibrationBuilderECRパルスシーケンスがずれていた問題を修正。 9013を修正。 -
の問題を修正しました。
pulse_drawer()場合によっては、出力ビジュアライゼーションがスケジュール内のいくつかのチャンネルを省略してしまう問題を修正しました。 8981を修正。
エア 0.11.2
変更なし
IBM Q プロバイダー 0.19.2
変更なし