Qiskit 0.33 リリースノート
0.33.1
Terra 0.19.1
前奏曲
Qiskit Terra 0.19.1 はバグフィクスリリースで、 0.19.0 の制御フロービルダーインターフェイスで構築された回路、条件付きゲート、新しい Terra オブジェクトの QPY シリアル化に関するいくつかの問題を解決しています。
非推奨のメモ
-
ルース関数
qiskit.circuit.measure.measure()とqiskit.circuit.reset.reset()は非推奨であり、将来のリリースで削除される予定である。 のメソッドとしてアクセスする必要があります。QuantumCircuit:from qiskit import QuantumCircuit circuit = QuantumCircuit(1, 1) # Replace this deprecated form ... from qiskit.circuit.measure import measure measure(circuit, 0, 0) # ... with either of the next two lines: circuit.measure(0, 0) QuantumCircuit.measure(circuit, 0, 0)
バグ修正
-
回路変換関数のエラーを修正
circuit_to_gate()とcircuit_to_instruction()(および関連する回路メソッドQuantumCircuit.to_gate()およびQuantumCircuit.to_instruction())が、レジスタのないビット、または複数のレジスタのビットを持つ回路に作用するときのエラーを修正しました。 以前は、作成されたゲートや命令に必要なビット数が正しく計算されず、しばしば変換中に例外が発生していた。 -
ビルダー・インターフェイスで作成されたコントロール・フロー操作の
QuantumCircuit.copy()を呼び出すとエラーが発生する問題を修正した。 例えば、以前はエラーでしたが、現在は正常に返されます:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.if_test((creg, 0)): circ.h(0) if_else_instruction, _, _ = circ.data[0] true_body = if_else_instruction.params[0] true_body.copy() -
コントロール・フロー・ビルダー・インターフェースが、ネストされたコントロール・フロー・スコープで条件として
ClassicalRegisterをネストされた制御フロースコープの条件として使用できるようになった。 以前は、これをやってもすぐにはエラーにならなかったが、内部回路ブロックに正しいレジスタが定義されていなかったため、後で内部ブロックと連動するロジックが失敗していた。たとえば、以前は古典的なレジスタを条件とする内部ブロックを描画しようとすると描画が失敗していたが、この例のように成功するようになった:
from qiskit import QuantumCircuit from qiskit.circuit import QuantumRegister, ClassicalRegister qreg = QuantumRegister(4) creg = ClassicalRegister(1) circ = QuantumCircuit(qreg, creg) with circ.for_loop(range(10)) as a: circ.ry(a, 0) with circ.if_test((creg, 1)): circ.break_loop() print(circ.draw(cregbundle=False)) print(circ.data[0][0].blocks[0].draw(cregbundle=False)) -
を使用したオブジェクトのシリアライズに関する
qpy_serializationサポートを修正した。QuantumCircuitオブジェクトのシリアライズをサポートした。ParameterVectorまたはParameterVectorElementをパラメータとして使用しているオブジェクトのシリアライズをサポートしました。 以前は、ParameterVectorElementパラメータは、QPYシリアライズでは単にParameterとして扱われていた。ParameterVectorコンテキストがQPYで失われparametersの出力順序が正しくない可能性がありました。この問題を解決するには、新しいQPYフォーマットのバージョン 3が必要だった。 この新フォーマット・バージョンには、
qpy_serializationドキュメントの PARAMETER_VECTOR_ELEMENTで説明されているParameterVectorElementクラスの表現が含まれている。 -
オブジェクトをシリアライズするための
qpy_serializationサポートを修正した。PauliEvolutionGateオブジェクトのシリアライズをサポートした。 以前はPauliEvolutionGateオブジェクトとしてデシリアライズされていました。Gateオブジェクトとしてデシリアライズされていた。PauliEvolutionGate. しかし、この場合、元の状態はPauliEvolutionGate. これは、このリリースから回路のPauliEvolutionGateが1:1で保持されるように修正されました。 この唯一の制限は、カスタムEvolutionSynthesisクラスをサポートしていないことです。 から利用可能なクラスのみqiskit.synthesisから利用可能なクラスのみがPauliEvolutionGateで使用できます。この問題を解決するには、新しいQPYフォーマットのバージョン 3が必要だった。 この新しいフォーマットのバージョンには
PauliEvolutionGateクラスの表現が含まれている。これはqpy_serializationドキュメント PAULI_EVOLUTION で説明されている。 -
qiskit.circuit.measure.measure()、qiskit.circuit.reset.reset()の2つの緩やかな関数が、非推奨期間なしに誤って削除された。 これらは復活したが、メソッドQuantumCircuit.measure()とQuantumCircuit.reset()それぞれ非推奨とされ、将来のリリースで削除される予定です。
その他の注意事項
-
新しいコントロール・フロー・ビルダー・インターフェイスは、さまざまなコンテキスト・マネージャーとヘルパー・オブジェクトを使って仕事をする。 これらは公開APIの一部とみなされるべきではなく、警告なしに変更されたり削除されたりする可能性がある。 ビルダー・インターフェースの使用は、次のように記述される動作が安定性を保証している。
QuantumCircuit.for_loop(),while_loop()とif_test()で記述されたビルダー・インターフェースの振る舞いは標準的な非推奨ポリシーに従うが、これを実現するために使われる実際のオブジェクトはそうではないという意味で、ビルダー・インターフェースの使い方には安定性が保証されている。 オブジェクト(IfContextやControlFlowBuilderBlockなど)が現在の場所に存在したり、メソッドや属性が付加されていることに依存してはならない。これは、 0.19.0 のリリースでは以前は明らかではなかった。 このようなオブジェクトはすべて、ドキュメンテーションの文字列でこのことを明示する警告が出るようになった。 将来的には、その場所やバックの実装がまったく異なるものになる可能性が高い。
エア 0.9.1
変更なし
イグニス 0.7.0
変更なし
IBM Q プロバイダー 0.18.2
バグ修正
- 回路メタデータに
Parameterが渡された場合にジョブがクラッシュし続ける問題を #1065 で修正。 - シリアライズされる回路が
BlueprintCircuitの場合、qiskit.providers.ibmq.runtime.RuntimeEncoderが余計な decompose() を行ってしまう問題を #1094 で修正。
0.33.0
このリリースにより、QiskitにおけるQiskit Aquaプロジェクトのサポートが正式に終了します。 これは元々 0.25.0 リリースで非推奨とされていたもので、そのリリースで文書化されていたように、 qiskit-aqua パッケージは Qiskit メタパッケージから削除されました。つまり、 pip install qiskit はもはや qiskit-aqua を含まないことになります。 しかし、pythonパッケージングの制限のため、 pip install -U qiskit を使ってQiskitの旧バージョンを本リリース(または将来のリリース)にアップグレードする際、 qiskit-aqua の既存インストールを自動的に削除することはできません。 以前のバージョンからアップグレードする場合は、Qiskit Aquaを pip uninstall qiskit-aqua 、手動でアンインストールするか、新しいpython環境にインストールすることをお勧めします。
qiskit-aqua で提供されていたアプリケーション・モジュールは、いくつかの新しいパッケージに分割された: qiskit-optimization qiskit-nature、 qiskit-machine-learning、 qiskit-finance。 これらのパッケージは単独でインストールできる(標準のpip installコマンドで、例えば pip install qiskit-nature ) またはQiskitメタパッケージの残りの部分をオプションのエクストラとして(例えば pip install 'qiskit[finance,optimization]' または pip install 'qiskit[all]' )。 コア・アルゴリズムとオペレーター・フローは現在、Qiskit Terra qiskit.algorithms と qiskit.opflow の一部として存在している。 Aquaの既存の使用方法に応じて、アプリケーションパッケージまたはQiskit Terraの新しいモジュールを使用する必要があります。 Qiskit Aquaからの移行方法の詳細については、 Aqua移行ガイドをご参照ください。
このリリースでは、Qiskit Ignisプロジェクトも正式に非推奨となります。 従って、将来のリリースでは、 qiskit-ignis パッケージは Qiskit メタパッケージから削除されます。つまり、その将来のリリースでは、 pip install qiskit は qiskit-ignis を含まなくなります。 Qiskit Ignisは Qiskit Experiments プロジェクトに取って代わられ、活発な開発は終了しました。 非推奨ではあるが、ユーザーがIgnisから移行するのに十分な機会を提供するため、重要なバグ修正と互換性の修正は引き続き行われる。 非推奨期間終了後(このリリースから3ヶ月以内)、プロジェクトは引退し、アーカイブされる。 Qiskit IgnisからQiskit Experimentsへの移行方法については移行ガイドをご参照ください。
Terra 0.19.0
前奏曲
Qiskit Terra 0.19 リリースのハイライトは以下の通り:
- 抽象的なQiskit/ハードウェアインターフェースの新バージョンである
BackendV2新しいデータ構造Targetを追加し、バックエンドがトランスパイラの制約をより適切にモデル化できるようにしました。 - への拡張可能なプラグインインターフェースです。
UnitarySynthesisトランスパイラパスへの拡張可能なプラグインインターフェースで、ユーザーや他のパッケージがQiskit Terraの合成ルーチンを新しいメソッドで拡張できるようにします。 forとwhileのループとif/elseのステートメントを表す制御フロー命令。QuantumCircuit. Qiskit Aerのシミュレータは間もなくこれらの新しい命令に対応できるようになり、よりダイナミックな量子プログラムを書くことができるようになる。- 進化する OpenQASM 3仕様の予備的サポート。 新しい
qiskit.qasm3モジュールを使ってQuantumCircuitを OpenQASM 3 にシリアライズすることができる。
このリリースは、Qiskitにおける Python 3.6 のサポートを終了するものです。 Qiskit Terraのこのリリースと、その後の 0.19.x シリーズのバグフィックスリリースは、 Python 3.6 で動作する最後のリリースとなります。 Qiskit Terraの次のマイナーリリース( 0.20.0 )から、最低限必要な Python のバージョンは 3.7 になります。
いつものように、このリリースには他にも多くの機能と修正がある。
新機能
-
QuantumCircuit.decompose()とそれに対応するトランスパイラー・パスDecomposeは、オプションでゲート名のコレクションを含むパラメータを受け付けるようになりました。 このパラメーターが与えられると、一致する名前のゲートだけが分解される。 これはUnixシェル・スタイルのワイルドカード・マッチをサポートする。 例:qc.decompose(["h", "r[xz]"])は、
h、rx、rzのゲートを分解するが、(たとえば)xのゲートはそのままにしておく。 -
オプティマイザに
termination_checker引数を追加。SPSA引数を追加した。 これにより、ユーザーはカスタム終了基準を実装することができる。import numpy as np from qiskit.algorithms.optimizers import SPSA def objective(x): return np.linalg.norm(x) + .04*np.random.rand(1) class TerminationChecker: def __init__(self, N : int): """ Callback to terminate optimization when the average decrease over the last N data points is smaller than the specified tolerance. """ self.N = N self.values = [] def __call__(self, nfev, parameters, value, stepsize, accepted) -> bool: """ Returns: True if the optimization loop should be terminated. """ self.values.append(value) if len(self.values) > self.N: last_values = self.values[-self.N:] pp = np.polyfit(range(self.N), last_values, 1) slope = pp[0] / self.N if slope > 0: return True return False maxiter = 400 spsa = SPSA(maxiter=maxiter, termination_checker=TerminationChecker(10)) parameters, value, niter = spsa.optimize(2, objective, initial_point=np.array([0.5, 0.5])) -
新バージョンの
Backendインターフェイスを追加した、BackendV2. この新しいバージョンは、前のバージョンから大きく変わりました、BackendV1バックエンドのプロパティ(量子ビット数など)に対するユーザのアクセスパターンと、バックエンドがトランスパイラに制約を表現する方法の両方を変更します。 メソッドによる)回路の実行は変わらない。run()メソッドによる)回路の実行に変更はない。 バックエンドBackendV2バックエンドはconfiguration(),properties()を構築するdefaults()メソッドがある。BackendConfiguration,BackendPropertiesとPulseDefaultsオブジェクトをそれぞれ構築するBackendV1オブジェクトの属性として直接アクセスできる。BackendV2オブジェクトの属性として直接アクセスできる。 例えば、バックエンドの量子ビット数を求めるには、次のようにする。BackendV1を持つバックエンドの量子ビット数を得るにはnum_qubits = backend.configuration().n_qubits一方
BackendV2である:num_qubits = backend.num_qubits抽象クラスで公開される属性の数は、ハードウェアやベンダーに依存しないように設計されています。
BackendV2クラスで公開される属性の数は、ハードウェアやベンダーにとらわれない必須フィールドやオプションフィールドのセットになるように設計されています。 抽象BackendV2で定義されている以外の属性やメソッドのサポートを追加することができます。BackendV2で定義されている以上の属性やメソッドのサポートを追加することができますが、これらはQiskit全体で普遍的にサポートされるわけではありません。プロバイダの作者にとって重要なもう1つの重要な変更点は、特定のバックエンドのプロパティをトランスパイラに公開する方法です。
BackendV2特定のバックエンドのプロパティをどのようにトランスパイラに公開するかです。 これはBackendV2これはTargetオブジェクトで行われます。 そのTarget属性によって公開されます。target属性によって公開されるこの属性は、特定のバックエンドで回路を実行するための制約のセットを表すために使用されます。 によって以前に公開された情報のサブセットが含まれている。BackendConfiguration,BackendPropertiesおよびPulseDefaultsクラスによって公開されていた情報のサブセットが含まれています。 プロバイダーをBackendV2を使用するようにプロバイダを移行する場合 (あるいは新しいプロバイダパッケージを作成する場合)、 バックエンドオブジェクトの構築は主にバックエンド用のTargetオブジェクトを作成することです。 -
新しい
Targetクラスをtranspilerモジュールを追加した。 このTargetクラスは、バックエンドの制約をコンパイラに表現するために設計されています。 このTargetクラスはBackendV2クラスはバックエンドで使用されることを意図しており、バックエンドが今後トランスパイラのために制約をモデル化する方法です。 これは、ターゲット・デバイスを制御するために使用される、以前は別々であったフィールドを1つのデータ構造にまとめたものである。transpile()ターゲット・デバイス(例:basis_gates、coupling_map、instruction_durationsなど)を制御するために使用されていたフィールドを1つのデータ構造にまとめたもの。 また、ヘテロジニアスゲートセット、マルチ量子ビットゲートの接続性、同じゲートのチューニングバリアントなど、これまで利用可能だった機能に加えて、さらなる機能が追加されている。 現在のところ、トランスパイラーはこのような制約をすべて織り込んでいるわけではないが、時間の経過とともに余分な機能を活用するようになるだろう。 -
この
Optionsクラスでバリデータを指定できるようになりました。 これによりBackendオブジェクトのフィールドにユーザーが入力した値に対する基本的なバリデーションをオプションで指定することができます。Optionsオブジェクトの 例えばOptionsオブジェクトが定義されていたとする:from qiskit.providers.Options options = Options(shots=1024)を使えば、ショットのバリデーターを1から4096の間に設定することができる:
options.set_validator('shots', (1, 4096))バリデータを設定すると
update_options()メソッドを呼び出すと、shotsが更新される場合、提案された新しい値が有効な範囲内であることがチェックされます。 -
新しいトランスパイラー分析パスを追加、
ContainsInstructionを追加した。qiskit.transpiler.passesモジュールを追加した。 このパスは、回路に特定の命令が含まれているかどうかを判断するために使用される。 初期化時に1つのパラメータを受け取り、チェックする命令名を指定し、回路にその命令が含まれているかどうかをプロパティセットにブール値で設定する。 例:from qiskit.transpiler.passes import ContainsInstruction from qiskit.circuit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() property_set = {} # Contains Hadamard contains_h = ContainsInstruction("h") contains_h(circuit, property_set) assert property_set["contains_h"] == True # Not contains SX contains_sx = ContainsInstruction("sx") contains_sx(circuit, property_set) assert property_set["contains_sx"] == False -
ユーティリティ関数
qiskit.utils.detach_prefix()を追加した。apply_prefix(). 新しい関数は、与えられた浮動小数点値から、スケーリングされた値と接頭辞のタプルを返します。 例えば、値1.3e8は、(130, "M")に変換され、130 MHzのようなユーザーフレンドリーなフォーマットで値を表示するために使用することができます。 -
BIPMappingオブジェクトの構築において、objectiveオプションに"gate_error"と"balanced"の値が使用できるようになり、"balanced"がデフォルトになった。"gate_error"。BackendPropertiesインスタンスを渡す必要がある。backend_propkwargには、目的の計算に使用される 2q-gate ゲートエラーが含まれている。"balanced"目標は、そのインスタンスが与えられていれば、それを使用する。BackendPropertiesインスタンスが与えられている場合はそれを使用するが、そうでない場合は、新しいパラメータdefault_cx_error_rateで与えられたCXエラーレートを仮定する。 バランスド・オブジェクティブのゲートエラー成分と深さ成分の相対的な重みは、新しいパラメータ(depth_obj_weight)で制御できる。 -
初期化時に設定された
VQEクラスのすべての属性が初期化時に設定され、ゲッターとセッターでアクセスできるようになりました。 さらに、VQE属性ansatzとoptimizerのデフォルト値は、Noneを割り当てることでリセットできる:vqe = VQE(my_ansatz, my_optimizer) vqe.ansatz = None # reset to default: RealAmplitudes ansatz vqe.optimizer = None # reset to default: SLSQP optimizer -
新しいメソッド
PauliList.group_qubit_wise_commuting()をPauliListを相互に量子ビット整合をとるPauli演算子を追加した。 例:from qiskit.quantum_info import PauliList, Pauli pauli_list = PauliList([Pauli("IY"), Pauli("XX"), Pauli("YY"), Pauli("YX")]) pauli_list.group_qubit_wise_commuting() -
新しいカップリング・マップのコンストラクタ・メソッド
CouplingMap.from_hexagonal_lattice()を追加した。 例えば、 2x2 六角形の格子結合写像を構築する:from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_hexagonal_lattice(2, 2) cmap.draw() -
新しい偽のバックエンド・クラスは、
qiskit.test.mock。 これらには、ibmq_brooklyn、ibmq_manila、ibmq_jakarta、ibmq_lagosのモック版が含まれる。 他のフェイクバックエンドと同様、これらにはキャリブレーションデータのスナップショットが含まれる(すなわち、backend.defaults()) およびエラーデータ(すなわちbackend.properties()) 実際のシステムから取得したもので、ローカルテスト、コンパイル、シミュレーションに使用できる。 -
を追加した。
OperatorBase.is_hermitian()メソッドを追加した。NumPyEigensolverそしてNumPyMinimumEigensolverオペレータがエルミートである場合、eighまたはeigshを使って固有値問題を解く。 -
新しいコンストラクタ・メソッドを追加
PassManagerConfig.from_backend(). これはPassManagerConfigオブジェクトを構築します。 この機能を使えば、プリセット・パスマネージャーを簡単に構築できる。 例:from qiskit.transpiler.passmanager_config import PassManagerConfig from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.test.mock import FakeMelbourne pass_manager = level_1_pass_manager( PassManagerConfig.from_backend(FakeMelbourne(), seed_transpiler=42) ) -
新しいトランスパイラー・パスが追加されました、
PulseGatesこれは、命令スケジュール・マップからユーザが提供したキャリブレーションを自動的に抽出し、ゲート・スケジュールをパルス・ゲートとして指定された(トランスパイルされた)量子回路にアタッチします。トランス
PulseGatesトランスパイラー・パスは、0から3までのすべての最適化レベルに適用される。 エンドユーザーが明示的にbackend.defaults().instruction_schedule_mapを上書きしない限り、ゲートの実装は更新されない。 このパスにより、ユーザーは、ハードウェア上で実行されるすべての回路をQuantumCircuit.add_calibration()を個別に呼び出す手間を省くことができる。この新しいパスを補足するために、スケジュールが
InstructionScheduleMapに追加され、メタデータ・フィールド"publisher"で暗黙的に更新される。 バックエンドで較正されたゲート・スケジュールは、既に知られているスケジュールの較正で回路を上書きすることを避けるために、特別なパブリッシャーの種類を持っている。 通常、このメタデータは自動的に適用されるため、エンドユーザーが管理する必要はない。 地図にカスタムゲート校正があるかどうかはInstructionScheduleMap.has_custom_gate()を呼び出して、マップにカスタムゲート・キャリブレーションがあるかどうかを確認できます。実行中のすべての回路にカスタム・ゲート実装を適用する方法については、以下のコード例を参照してください。
from qiskit.test.mock import FakeGuadalupe from qiskit import pulse, circuit, transpile backend = FakeGuadalupe() with pulse.build(backend, name="x") as x_q0: pulse.play(pulse.Constant(160, 0.1), pulse.drive_channel(0)) backend.defaults().instruction_schedule_map.add("x", (0,), x_q0) circs = [] for _ in range(100): circ = circuit.QuantumCircuit(1) circ.sx(0) circ.rz(1.57, 0) circ.x(0) circ.measure_active() circs.append(circ) circs = transpile(circs, backend) circs[0].calibrations # This returns calibration only for x gate命令スケジュール・マップは変更可能なオブジェクトであることに注意。 エントリーの1つをオーバーライドし、そのバックエンドを他の実験に使用すると、誤ってゲートの定義を更新してしまう可能性がある。
backend = FakeGuadalupe() instmap = backend.defaults().instruction_schedule_map instmap.add("x", (0, ), my_x_gate_schedule) qc = QuantumCircuit(1, 1) qc.x(0) qc.measure(0, 0) qc = transpile(qc, backend) # This backend uses custom X gate特定の実験のゲート定義を更新したい場合は、まず命令スケジュール・マップをディープコピーし、トランスパイラに直接渡す必要がある。
-
BIPMappingのコンストラクタに新しいオプションqubit_subsetを導入。 このオプションにより、マッピング時に使用する物理量子ビットを1行で指定することができる(デバイスのcoupling_map):mapped_circ = BIPMapping( coupling_map=CouplingMap([[0, 1], [1, 2], [1, 3], [3, 4]]), qubit_subset=[1, 3, 4] )(circ)以前は、同じことをするためには、使用する量子ビットだけを含む縮小版
coupling_mapを提供し、結果の回路を元のcoupling_mapに埋め込み、それに応じてQuantumCircuit._layoutを更新しなければならなかった:reduced_coupling = coupling_map.reduce(qubit_to_use) mapped = BIPMapping(reduced_coupling)(circ) # skip the definition of fill_with_ancilla() # recover circuit on original coupling map layout = Layout({q: qubit_to_use[i] for i, q in enumerate(mapped.qubits)}) for reg in mapped.qregs: layout.add_register(reg) property_set = {"layout": fill_with_ancilla(layout)} recovered = ApplyLayout()(mapped, property_set) # recover layout overall_layout = Layout({v: qubit_to_use[q] for v, q in mapped._layout.get_virtual_bits().items()}) for reg in mapped.qregs: overall_layout.add_register(reg) recovered._layout = fill_with_ancilla(overall_layout) -
のコンストラクタに
ignore_pauli_phaseとcopyの引数を追加。SparsePauliOp.ignore_pauli_phaseのphase属性が読み込まれないようにする。PauliListが読み込まれるのを防ぐ。PauliListがZXの内部規約ですべてのフェーズがゼロであることがすでに知られている場合は、よりパフォーマンスが高くなります。copyにより、copy=Falseを明示的に設定した場合、入力データのコピーを避けることができる。 -
以下のパフォーマンスが向上した。
SparsePauliOpオペレーションsimplify()( #7122 参照)compose()( #7126 参照)_add()( #7138 参照)from_list()と__init__()(#7138の他の議論を参照)。
-
を追加した。
SparsePauliOp.sum()メソッドを追加した。SparsePauliOps. この方法は、ループの中でインスタンスを足し合わせるよりも、かなりパフォーマンスが良い。 例えばSparsePauliOpを足していく:from qiskit.quantum_info import SparsePauliOp, random_pauli_list sparse_ops = [SparsePauliOp(random_pauli_list(10, 10)) for _ in [None]*1000] total = sparse_ops[0] for op in sparse_ops[1:]: total += opこれで、はるかに効率的に(スピードもタイピングも!)できるようになった として:
SparsePauliOp.sum(sparse_ops) -
の基本クラスである
ParametricPulseのコンストラクタに引数limit_amplitudeを追加した。Gaussian,GaussianSquare,DragおよびConstantの基本クラスであるコンストラクタに引数 を追加し、パルス単位で振幅制限1を無効にできるようにした。limit_amplitude=Falseでは、個々のパルスは、"1 "を上げることなく "1 "を超える振幅を持つことができる。PulseError. 詳細は #6544を参照。 -
使用
QuantumCircuit.draw()またはcircuit_drawer()latexを使うと、例えばファイル名の拡張子から推測される画像形式のファイルが生成される:import qiskit circuit = qiskit.QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.draw('latex', filename='./file.jpg')これで回路図がJPEG形式で保存される。 以前は、画像は常にPNG形式でした。 詳細は #6448を参照。
これで、例えばサポートされていないファイル名の拡張子に遭遇した場合:
circuit.draw('latex', filename='./file.spooky')これは、ファイル名の拡張子をサポートされている画像フォーマットに変更するために
ValueError。 -
パラメータ
filenameをplot_gate_map()とplot_coupling_map()にパラメータを追加した。 -
近似量子コンパイラとそれに対応するユニタリー合成プラグイン実装を導入。 メインのAQCクラスは
AQCで、ユニタリー行列を近似回路にコンパイルするスタンドアロン版です。 このプラグインはtranspile()unitary_synthesis_method'aqc'によって呼び出される。 参照qiskit.transpiler.synthesis.aqcを参照のこと。 -
に
filter_function引数を追加。QuantumCircuit.depth()とQuantumCircuit.size()の引数を追加した。例えば、2量子ビットのゲートの数を求めるにはこうする:
circuit.size(lambda x: x[0].num_qubits == 2)あるいは、0番目の量子ビットに作用するT個のゲートの深さを求める:
circuit.depth(lambda x: x[0].name == 't' and circuit.qubits[0] in x[1]) -
新しいトランスパイラー・パスを追加、
CollectMultiQBlocksを追加した。qiskit.transpiler.passesモジュールを追加した。 このパスは、量子ビットのグループに作用する中断のないゲートシーケンスを収集するために使用される。 既存のCollect2qBlocksしかし、そのパスが2量子ビットのブロックを見つけるために設計され、最適化されているのに対し、この新しいパスはどんなサイズのブロックでも見つけることができる。 -
の新しいコントロール・フロー操作のためのビルダー・インターフェースがある。
QuantumCircuit新しいForLoopOp,IfElseOpそしてWhileLoopOp. このインターフェイスは、同じ回路メソッド、 *すなわち *QuantumCircuit.for_loop(),QuantumCircuit.if_test()とQuantumCircuit.while_loop()これらはオーバーロードされ、bodyパラメータが与えられない場合、コンテキスト・マネージャを返します。 これらのコンテキスト・マネージャーのいずれかに入ると、スコープが回路にプッシュされ、すべてのゲート・コール(および他のスコープ)と、これらが使用するリソースをキャプチャし、最後に関連するオペレーションを構築する。 例えば、こんなことができるようになった:qc = QuantumCircuit(2, 2) with qc.for_loop(range(5)) as i: qc.rx(i * math.pi / 4, 0)これにより
ForLoopOpを生成する。qc。これは、qubit 0がループ本体内で使用される唯一のリソースであることを知っている。 これらのコンテキスト・マネージャーは入れ子にすることができ、その幅を正しく決定する。 を使用することができます。QuantumCircuit.break_loop()とQuantumCircuit.continue_loop()を使用すると、それがさらなるQuantumCircuit.if_test()ブロックに入れ子になっていても、ループの幅に合わせて正しく展開されます。コンテキスト・マネージャーは
if_test()コンテキスト・マネージャは連鎖したマネージャを提供し、必要であれば、elseのようなブロックを作るのに使うことができる:qreg = QuantumRegister(2) creg = ClassicalRegister(2) qc = QuantumCircuit(qreg, creg) qc.h(0) qc.cx(0, 1) qc.measure(0, 0) with qc.if_test((creg, 0)) as else_: qc.x(1) with else_: qc.z(1)マネージャーは、
ifとelseのボディが、同じリソースのセット上で定義されていることを保証する。 -
新しいトランスパイラー・パスを導入
InverseCancellationを一般化したCXCancellationを一般化する新しいトランスパイラー・パスを導入した。 初期化してInverseCancellationを初期化し、キャンセルするゲートを渡すなどして使用できる:from qiskit.transpiler.passes import InverseCancellation from qiskit import QuantumCircuit from qiskit.circuit.library import HGate from qiskit.transpiler import PassManager qc = QuantumCircuit(2, 2) qc.h(0) qc.h(0) pass_ = InverseCancellation([HGate()]) pm = PassManager(pass_) new_circ = pm.run(qc) -
のコンストラクタには
RZXCalibrationBuilderには2つの新しいkwargsinstruction_schedule_mapとqubit_channel_mappingがあります。InstructionScheduleMapをそれぞれ取ります。 これらの新しい引数は、バックエンドターゲットから必要な情報を直接指定するために使われる。 これらは、BaseBackendまたはBackendV1オブジェクトをbackend引数で直接渡す代わりに使用する。 -
量子ビットだけで構成される状態の
Statevector量子ビットだけで構成される状態のsは、 LaTeX、ケット記法で描くことができる。 ケット記法では、状態ベクトルのエントリーは、分数や2の平方根のような正確な因数が描かれるように処理される。 特定の規約は、conventionキーワード引数に、"ket"または"vector"のいずれかを適切に渡すことで選択できる:import math from qiskit.quantum_info import Statevector sv = Statevector([math.sqrt(0.5), 0, 0, -math.sqrt(0.5)]) sv.draw("latex", convention="ket") sv.draw("latex", convention="vector") -
新しいトランスパイラー
EchoRZXWeylDecompositionカルタンの分解を利用して、任意の2量子ビットゲートをエコーRZXゲートで分解できるようにした。 他のトランスパイラー・パスと組み合わせることで、任意の回路を、同じユニタリーを実装するRZXゲートをベースとしたパルス効率の高い回路にトランスパイルすることができる。 -
その
SPSAとQNSPSAオプティマイザ・クラスは、反復と初期キャリブレーションの両方で、できるだけ多くの回路評価をバッチ処理できるようになりました。 のコンストラクタにmax_evals_groupedkwarg を設定することで、これを活用できる。VQEのコンストラクタにSPSAまたはQNSPSAのどちらかをoptimizerのパラメータとして使用する場合に、コンストラクタにkwargを設定することで活用できる。 例:from qiskit.circuit.library import TwoLocal from qiskit.algorithms import VQE from qiskit.algorithms.optimizers import QNSPSA from qiskit.test.mock import FakeMontreal backend = FakeMontreal() ansatz = TwoLocal(2, rotation_blocks=["ry", "rz"], entanglement_blocks="cz") qnspsa = QNSPSA(fidelity, maxiter=5) vqe = VQE( ansatz=ansatz, optimizer=qnspsa, max_evals_grouped=100, quantum_instance=backend, ) -
このリリースでは、ユーザー定義のRZXゲートの集合を対象とした、2量子ビット・ゲートの分解手法を紹介します。 トランスパイラのユーザーは、
basis_gatesのリストに'rzx'を含めることで、 {RZX(pi/2),RZX(pi/4), andRZX(pi/6)} の分解を有効にすることができます。transpile(). 量子情報パッケージのユーザーは、メソッド自体をXXDecomposerクラスで見つけることができる。 -
トランスパイラ・パスを追加
Optimize1qGatesSimpleCommutationこれは、再合成の機会を発見するために、単一量子ビットゲートを転置する戦略に従って回路を最適化する。 -
に
max_job_triesパラメータを追加した。QuantumInstanceパラメータを追加しました。 以前は、ジョブがキャンセルされたりバックエンドでエラーが発生したりしても、送信と結果の取得が無限に試行されていました。 デフォルトは50になり、max_job_tries=-1を設定することで、以前の動作を実現できる。 6872と #6821を修正。 -
の
latex出力メソッドcircuit_drawer()関数とQuantumCircuit.draw()メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、ゲートの古典的条件付けを単一の古典的ビットでサポートするという新機能と、ラテックス引き出しの互換性のために追加された。 -
の
"mpl"出力メソッドcircuit_drawer()関数とQuantumCircuit.draw()メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、"mpl"の引き出しと、単一古典ビットに対するゲートの古典的条件付けをサポートする新機能との互換性のために追加された。 -
の
text出力メソッドcircuit_drawer()関数とQuantumCircuit.draw()メソッドは1ビット条件のゲートを含む回路を描けるようになった。 これは、ゲートの古典的条件付けを単一の古典的ビットでサポートするという新機能と、テキスト引き出しの互換性のために追加された。 -
新しい分析トランスパイラ・パスが追加されました、
GatesInBasisに追加された。qiskit.transpiler.passes. このパスはDAGCircuitをチェックする。 のすべてのゲートが設定された基本セットに入っていれば、プロパティセットの属性"all_gates_in_basis"をTrueに設定し、入っていなければ に設定する。DAGCircuitのすべてのゲートが設定された基本セットにあればFalse、なければ。 例:from qiskit.circuit import QuantumCircuit from qiskit.transpiler.passes import GatesInBasis # Instatiate Pass basis_gates = ["cx", "h"] basis_check_pass = GatesInBasis(basis_gates) # Build circuit circuit = QuantumCircuit(2) circuit.h(0) circuit.cx(0, 1) circuit.measure_all() # Run pass on circuit property_set = {} basis_check_pass(circuit, property_set=property_set) assert property_set["all_gates_in_basis"] -
新しいコンストラクタ・メソッドを2つ追加した、
from_heavy_hex()とfrom_heavy_square()そしてCouplingMapクラスに追加した。 これらのコンストラクタ・メソッドはCouplingMapこれらのコンストラクタ・メソッドは、 Chamberland et al、 2020.例:
from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_hex(5) cmap.draw()from qiskit.transpiler import CouplingMap cmap = CouplingMap.from_heavy_square(5) cmap.draw() -
HHLアルゴリズムは、行列が負の固有値を持つ場合に解を見つけることができるようになった。 これを可能にするために、アルゴリズムに値の符号を表す追加の量子ビットが追加され、ヘルパーアルゴリズムはこの新しい情報を処理するように更新された。ExactReciprocalはこの新しい情報を処理するように更新された。 詳細は #6971を参照。 -
新しいクラスを2つ追加、
CompleteMeasFitterとTensoredMeasFitterをqiskit.utils.mitigationモジュールに これらのクラスは、measurement_error_mitigation_clsの kwarg の値としてのみ使用されます。QuantumInstanceクラスの これらのクラス(あるいはqiskit.utils.mitigation)のインスタンス化と使用は、measurement_error_mitigation_clskwargの外部では、内部プライベートAPIとして扱われるべきであり、依存してはならない。 -
その
ListOpクラスはqiskit.opflowにはcoeffs属性が追加され、演算子リストの係数のリストを返すようになりました。ListOp.coeff)が乗法的にリストに分配されます。 注意ListOpオブジェクトが入れ子になっている(oplistのListOpオブジェクトの中に含まれる)場合があることに注意してください。このような場合、coeffsメソッドが呼ばれると例外が発生します。 このListOp.coeffscoeffsメソッドは、ネスティングされていないPauliSumOpクラスの -
この
Statevectorクラスが添え字で指定できるようになりました。 の n 番目の係数を取り出すことができる。Statevectorのn番目の係数をstatevec[n]として取り出すことができる。 -
を追加した。
Statevector.innerインスタンスの内積を計算するStatevectorインスタンスの内積を計算するメソッドを追加した。 例:statevec_inner_other = statevec.inner(other)は
statevecとotherの内積を返す。statevecはStatevectorでなければならないが、otherはStatevector例えばNumpy配列のような。 -
新しいパラメータ、
add_bitsをQuantumCircuit.measure_all(). デフォルトでは、Trueに設定されている。ClassicalRegisterを追加するという以前の動作を維持するためです。Falseに設定すると、測定値はすでに存在するクラシック・ビットに保存される。 例えば、既存の古典的なビットで回路を作ったとする:from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister qr = QuantumRegister(2) cr = ClassicalRegister(2, "meas") circuit = QuantumCircuit(qr, cr)circuit.measure_all(add_bits=False)を呼び出すと、回路に追加されたMeasurementオブジェクトの出力先として、既存のクラシック・レジスタcrが使用される。 -
ParameterExpressionは、潜在的に未束縛のパラメータがある場合でも、数値変換を基礎となるシンボリック・ライブラリに委ねるようになった。 これにより、次のような式の変換が可能になる:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> float(x - x + 2.3) 2.3ここで、基礎となる式は固定値を持つが、パラメータ
xはまだ束縛されていない。 -
すべてのオプティマイザに
Optimizer.minimize()メソッドを追加した:Optimizerおよび派生クラスにメソッドを追加した。 このメソッドは、 SciPy’sminimize()関数のシグネチャを模倣しており、次のように返す。OptimizerResult.例 :
import numpy as np from qiskit.algorithms.optimizers import COBYLA def loss(x): return -(x[0] - 1) ** 2 - (x[1] + 1) ** 3 initial_point = np.array([0, 0]) optimizer = COBYLA() result = optimizer.minimize(loss, initial_point) optimal_parameters = result.x minimum_value = result.fun num_function_evals = result.nfev -
回路ライブラリに
PauliEvolutionGateを回路ライブラリ(qiskit.circuit.library)の時間発展を行うゲートを定義するPaulis. このゲートの合成はEvolutionSynthesisで実行され、ゲート自体から切り離される。 現在利用可能な合成法は以下の通りである:LieTrotter一次トロッター化SuzukiTrotter高次トロッター化MatrixExponential正確な行列ベースの進化
例:
from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.quantum_info import SparsePauliOp from qiskit.synthesis import SuzukiTrotter operator = SparsePauliOp.from_list([ ("XIZ", 0.5), ("ZZX", 0.5), ("IYY", -1) ]) time = 0.12 # evolution time synth = SuzukiTrotter(order=4, reps=2) evo = PauliEvolutionGate(operator, time=time, synthesis=synth) circuit = QuantumCircuit(3) circuit.append(evo, range(3)) -
新しい関数
plot_coupling_map()が導入され、既存の関数plot_gate_map()の機能を拡張した新しい関数が導入されました:num_qubitbackendの代わりに)qubit_coordinates、coupling_mapの3つのパラメータを受け取り、任意の量子ビット結合マップをプロットすることができます。 -
Qiskit Terraがシリアライズを初期サポートしました。
QuantumCircuitを OpenQASM 3 :from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 qc = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) print(qasm3.dumps(qc))この初期リリースでは、名前付きレジスタ、基本的な組み込み命令(メジャー、バリア、リセットなど)、ユーザー定義ゲート、ユーザー定義命令(サブルーチンとして)、および本リリースで導入された新しい制御フロー構造体のサポートが制限されています:
from qiskit.circuit import QuantumCircuit, QuantumRegister, ClassicalRegister from qiskit import qasm3 import math composite_circ_qreg = QuantumRegister(2) composite_circ = QuantumCircuit(composite_circ_qreg, name="composite_circ") composite_circ.h(0) composite_circ.x(1) composite_circ.cx(0, 1) composite_circ_gate = composite_circ.to_gate() qr = QuantumRegister(2, "qr") cr = ClassicalRegister(2, "cr") qc = QuantumCircuit(qr, cr) with qc.for_loop(range(4)) as i: qc.rx(i * math.pi / 4, 0) qc.cx(0, 1) qc.barrier() qc.append(composite_circ_gate, [0, 1]) qc.measure([0, 1], [0, 1]) print(qasm3.dumps(qc)) -
この
QDriftの合成メソッドとして定式化された。PauliEvolutionGateから派生したTrotterizationBase.from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import PauliEvolutionGate from qiskit.synthesis import QDrift from qiskit.opflow import X, Y, Z qdrift = QDrift(reps=2) operator = (X ^ 3) + (Y ^ 3) + (Z ^ 3) time = 2.345 # evolution time evolution_gate = PauliEvolutionGate(operator, time, synthesis=qdrift) circuit = QuantumCircuit(3) circuit.append(evolution_gate, range(3)) -
QPYシリアライゼーションは、以下の属性を表現できるようになりました。
global_phaseを表現できるようになりました。QuantumCircuitintオブジェクトの属性を表現できるようになりました、Parameterオブジェクト、またはParameterExpressionオブジェクトの属性を表現できるようになりました。 以前のバージョンのQPYはglobal_phasefloatであった。このため、追加されたタイプを表現するために、このリリースで導入されたQPYフォーマット Version 2が必要となる。
-
新しい
find_bit()メソッドが追加された。QuantumCircuitクラスに新しいメソッドが追加された。Bitのインデックスとレジスタをルックアップできるようになりました。 このメソッドは、Bitのインデックスを含む2つの要素namedtupleを返します。qubits(またはQubitまたはclbits(またはClbit)のインデックスと、1) length-2 を含む各回路RegisterBitBitを含むRegisterタプルのリスト。例:
from qiskit.circuit import QuantumCircuit, QuantumRegister, Qubit reg1 = QuantumRegister(3, 'foo') qubit = Qubit() reg2 = QuantumRegister(2, 'bar') qc = QuantumCircuit(reg1, [qubit], reg2) print(qc.find_bit(reg1[2])) print(qc.find_bit(qubit))を生み出すだろう:
BitLocations(index=2, registers=[(QuantumRegister(3, 'foo'), 2)]) BitLocations(index=3, registers=[]) -
つの新しい
Instruction動的回路の制御フロー操作をサポートするために、3つの新しいサブクラスが追加された:WhileLoopOp,ForLoopOpおよびIfElseOp. さらに、2つのサブクラスがある、BreakLoopOpとContinueLoopOpの2つのサブクラスが追加され、それぞれループ・コンテキストの中断と次の反復をサポートするようになった。これらは
Instructionとして作成したり、既存のQuantumCircuitインスタンスに追加することもできる、QuantumCircuit.while_loop(),for_loop(),if_test(),if_else(),break_loop()そしてcontinue_loop(). -
追加された
BaseReadoutMitigator古典的な測定誤差軽減器を実装するための抽象基底クラスを追加。 これらのオブジェクトは、測定エラーのあるバックエンドでの回路実行から返されるオブジェクトの測定エラーを軽減するためのものである。Countsこれらのオブジェクトは、バックエンドでの回路の実行から返されるオブジェクトの測定エラーを軽減するためのものです。読み出しミティゲーター・クラスには、主に2つのメソッドがある:
expectation_value()これは、ノイズの多いオブジェクトから対角演算子の緩和された期待値と標準誤差を計算する。Countsを計算する。quasi_probabilities()を計算する。QuasiDistributionを計算する。
現在
qiskit.algorithmsモジュールとQuantumInstanceクラスでは、Qiskit Ignis から移行したレガシーミティゲータがまだ使われています。qiskit.utils.mitigation. 将来のリリースでは、新しいミティゲータクラスを使用するようにモジュールをアップグレードし、レガシーミティゲーションコードを非推奨にする予定です。 -
を追加した。
LocalReadoutMitigatorクラスが追加されました。 局所的な測定誤差とは、1量子ビットの測定誤差のテンソル積によって記述される誤差のことである。このクラスは、 単一量子ビットの測定エラー割り当て行列のリストで初期化することも、バックエンドのプロパティにある読み出しエラー情報を使用してバックエンドから初期化することもできます。
これは、 -qubitのミティゲーションに対して の複雑さを持つ。
QuasiDistributionと期待値。 -
を追加した。
CorrelatedReadoutMitigatorクラスが追加され、相関する測定誤差の測定読み出し誤差軽減を実行できるようになりました。 このクラスは、エラー確率を記述する 測定エラー割り当て行列で初期化することができます。 緩和は、 の緩和複雑度を持つ割り当て行列の逆行列を介して実装される。QuasiDistributionと期待値を持つ。 -
のコンストラクタに
QuasiDistribution.stddev_upper_boundクラスのコンストラクタに属性とkwargを追加した。QuasiDistributionクラスのコンストラクタに属性とkwargを追加した。 これはBaseReadoutMitigatorクラスで使用される。 -
メソッドを追加した。
shots()メソッドを追加した。qiskit.result.Countsメソッドを追加した。 -
を実行する場合
Groverアルゴリズムクラスを実行する場合、最適な電力が既知であり、単一の回路のみが実行される場合、コールバック関数を設定する必要はなくなり、Grover探索は最も可能性の高いビット列を返します。AmplificationProblem.is_good_stateコールバック関数を設定する必要はなくなり、Grover探索は最も可能性の高いビット列を返します。 一般に、グローバー演算子の最適なべき乗が不明な場合、アルゴリズムは異なるべき乗(すなわち反復)をチェックし、それを適用する。Groverアルゴリズムが異なるべき乗(すなわち反復)をチェックし、良いビット列が測定されたかどうかをチェックするためにis_good_state関数を適用する。 例えば、次のようなことができるようになった:from qiskit.algorithms import Grover, AmplificationProblem from qiskit.providers.aer import AerSimulator from qiskit.quantum_info import Statevector # Fixed Grover power: 2. grover = Grover(iterations=2, quantum_instance=AerSimulator()) # The ``is_good_state`` argument not required here since Grover search # will be run only once, with a power of 2. problem = AmplificationProblem(Statevector.from_label("111")) # Run Grover search and print the best measurement result = grover.amplify(problem) print(result.top_measurement) # should print 111 -
メソッド
remove_cregs()メソッドを追加した。DAGCircuitメソッドを追加。 -
メソッド
remove_clbits()メソッドを追加した。DAGCircuitメソッドを追加した。 削除されたビットを参照するクラシック・レジスタもすべて削除される。 -
新しいメソッドを追加、
replace_block_with_op()メソッドをDAGCircuitクラスを追加しました。 この方法は、DAG内のノードのブロックを1つの操作で置き換えるために使用される。 典型的な例はConsolidateBlocksパスで、ノードのブロックを同等のUnitaryGateノードに置き換える。 -
新しい分析トランスパイラー・パスを追加、
Collect1qRunsをqiskit.transpiler.passesモジュールを追加した。 このパスは、1つの量子ビットに作用する中断のないゲートシーケンスを見つけるために使われる。 と似ている。Collect2qBlocksとCollectMultiQBlocksに似ているが、複数量子ビットブロックではなく単一量子ビット実行用に最適化されている。 -
様々なトランスパイル・インターナルが、内部回路表現を操作する際に、 retworkx 0.10 の新機能を使用するようになりました。 への呼び出しが高速化されることがよくある。
transpile最適化レベルが高いほど、その効果は大きくなる。 詳細は #6302を参照。 -
を使用します。
UnitarySynthesisのトランスパイラ・パスはqiskit.transpiler.passesはコンストラクタに新しいkwarg、min_qubitsを持つ。 この値を指定すると、int、ユニタリー合成を実行する最小サイズのUnitaryGate。 のUnitaryGate。QuantumCircuitの、使用する量子ビットが少なければ、そのパスのインスタンスによってスキップされる。 -
EigensolverとMinimumEigensolverインターフェースは、それぞれのcompute_eigenvalues()とcompute_minimum_eigenvalue()メソッドのaux_operatorsパラメータの型Dict[str, Optional[OperatorBase]]をサポートするようになった。 この場合、補助固有値も、aux_operators辞書が提供する同じキーの下に辞書に格納される。 主演算子と通約しない演算子に対応するキーは削除される。 -
その
BasisTranslator,GateDirectionおよびCheckGateDirectionトランスパイラ・パスは、コンストラクタに新しいtargetkwargを持っています。Targetオブジェクトをパスのターゲットとして設定するために使うことができます。 これが設定されていれば、target_basis(パスの場合)または (パスの場合)の代わりに使用される。BasisTranslatorまたはcoupling_map(パスGateDirectionとCheckGateDirectionパスの場合)引数の代わりに使用されます。 -
で2つのトランスパイラ・ステージを許可する。
QuantumInstance1つはパラメータ化された回路用で、もう1つは束縛された回路(つまり自由パラメータを持たない)用である。 に、非拘束回路と拘束回路のパスを持つ量子インスタンスが渡された場合、サンプラーは、パラメータ化された回路に非拘束パスを一度だけ適用し、キャッシュします。CircuitSamplerに渡された場合、サンプラーはパラメータ化された回路に一度だけ非拘束パスを適用し、それをキャッシュします。これにより
VQEのような変分アルゴリズムでは、パラメータ化された回路に対してカスタム・パス・マネージャを一度実行し、さらに、各反復においてバウンドされた回路に対して異なるカスタム・パス・マネージャでトランスパイラを再度実行することができます。 すべてのパスがパラメータ化された回路をサポートしているわけではないので、異なるパス・マネージャーを実行できることは重要である(例えばOptimize1qGatesDecompositionはバインドされた回路パラメータでしか動作しません)。例えば、この機能により、VQEでパルス効率の良いCX分解を使用することができる
from qiskit.algorithms import VQE from qiskit.opflow import Z from qiskit.circuit.library.standard_gates.equivalence_library import StandardEquivalenceLibrary as std_eqlib from qiskit.transpiler import PassManager, PassManagerConfig, CouplingMap from qiskit.transpiler.preset_passmanagers import level_1_pass_manager from qiskit.transpiler.passes import ( Collect2qBlocks, ConsolidateBlocks, Optimize1qGatesDecomposition, RZXCalibrationBuilderNoEcho, UnrollCustomDefinitions, BasisTranslator ) from qiskit.transpiler.passes.optimization.echo_rzx_weyl_decomposition import EchoRZXWeylDecomposition from qiskit.test.mock import FakeBelem from qiskit.utils import QuantumInstance # Replace by a real backend! If not ensure qiskit-aer is installed to simulate the backend backend = FakeBelem() # Build the pass manager for the parameterized circuit rzx_basis = ['rzx', 'rz', 'x', 'sx'] coupling_map = CouplingMap(backend.configuration().coupling_map) config = PassManagerConfig(basis_gates=rzx_basis, coupling_map=coupling_map) pre = level_1_pass_manager(config) # Build a pass manager for the CX decomposition (works only on bound circuits) post = PassManager([ # Consolidate consecutive two-qubit operations. Collect2qBlocks(), ConsolidateBlocks(basis_gates=['rz', 'sx', 'x', 'rxx']), # Rewrite circuit in terms of Weyl-decomposed echoed RZX gates. EchoRZXWeylDecomposition(backend), # Attach scaled CR pulse schedules to the RZX gates. RZXCalibrationBuilderNoEcho(backend), # Simplify single-qubit gates. UnrollCustomDefinitions(std_eqlib, rzx_basis), BasisTranslator(std_eqlib, rzx_basis), Optimize1qGatesDecomposition(rzx_basis), ]) quantum_instance = QuantumInstance(backend, pass_manager=pre, bound_pass_manager=post) vqe = VQE(quantum_instance=quantum_instance) result = vqe.compute_minimum_eigenvalue(Z ^ Z) -
新しいユニタリー・シンセシス・プラグイン・インターフェースを導入。
UnitarySynthesisトランスパイラ・パスにシームレスに を呼び出すときに使用するプラグインを選択できる。transpile()unitary_synthesis_methodkwargをプラグイン名に設定することで、ユーザーは呼び出し時に使用するプラグインを選択できる。 インストールされているプラグインの完全なリストはqiskit.transpiler.passes.synthesis.plugin.unitary_synthesis_plugin_names()関数を使用して見つけることができます。 例えば、special_synthという名前の合成プラグインを含むパッケージをインストールした場合、それを使うことができる:from qiskit import transpile transpile(qc, unitary_synthesis_method='special_synth', optimization_level=3)これは
UnitarySynthesisを、special_synthプラグインをエクスポートする外部パッケージに含まれるメソッドに置き換えます。プラグインインターフェースは、Qiskitの外部パッケージが合成プラグインを含むことを宣伝できるようにするsetuptools エントリーポイントを中心に構築されています。 新しいプラグインの書き方については
qiskit.transpiler.passes.synthesis.pluginモジュールのドキュメントを参照してください。 -
新しいトランスパイラー・パスを追加、
VF2Layout. このパスでは、レイアウト割り当て問題を部分グラフ同型問題としてモデル化し、完璧なレイアウト(追加のルーティングを必要としないレイアウト)が存在する場合に、それを見つけるために rustworkxの VF2 アルゴリズム実装を使用します。 この新しいパスが提供する機能は、既存のパスに非常によく似ています。CSPLayoutしかしVF2Layoutは大幅に高速化されている。
既知の問題
-
の
"latex"の引き出しの"ket"の規約は、純粋に量子ビットからなる状態のみ有効である。Statevector.draw()の規約は、純粋に量子ビットからなる状態に対してのみ有効です。 もし2つ以上の次元の空白がある状態を使う場合は、convention="vector"を渡すか、別の引き出しを使うべきである。 -
OpenQASM 3のエクスポート機能はベータ版であり、Qiskit Terraのいくつかの機能はまだサポートされていません。
QuantumCircuitはまだサポートされていません。 特に、古典的なパラメータを持つカスタムサブルーチンをエクスポートしようとするとエラーが表示されることがあります。 OpenPulse. -
を単独で実行する場合
BasisTranslatorを単独で実行する場合、target引数をTargetオブジェクトに設定され、いくつかの単一量子ビットゲートが量子ビットの非重複セットにのみ適用できる状態で実行された場合、出力回路が誤ってTarget. 例えば、あなたが走ったとする:from qiskit.circuit import QuantumCircuit, Parameter from qiskit.circuit.library import UGate, RZGate, XGate, SXGate, CXGate from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel from qiskit.transpiler import PassManager, Target, InstructionProperties from qiskit.transpiler.passes import BasisTranslator gmap = Target() # U gate in qubit 0. theta = Parameter('theta') phi = Parameter('phi') lam = Parameter('lambda') u_props = { (0,): InstructionProperties(duration=5.23e-8, error=0.00038115), } gmap.add_instruction(UGate(theta, phi, lam), u_props) # Rz gate in qubit 1. phi = Parameter("phi") rz_props = { (1,): InstructionProperties(duration=0.0, error=0), } gmap.add_instruction(RZGate(phi), rz_props) # X gate in qubit 1. x_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(XGate(), x_props) # SX gate in qubit 1. sx_props = { (1,): InstructionProperties( duration=3.5555555555555554e-08, error=0.00020056469709026198 ), } gmap.add_instruction(SXGate(), sx_props) cx_props = { (0, 1): InstructionProperties(duration=5.23e-7, error=0.00098115), (1, 0): InstructionProperties(duration=4.52e-7, error=0.00132115), } gmap.add_instruction(CXGate(), cx_props) bt_pass = BasisTranslator(sel, target_basis=None, target=gmap) qc = QuantumCircuit(2) qc.iswap(0, 1) output = bt_pass(qc)outputがあるだろう。RZGateとSXGateを持つことになる。 これを修正するには、通常、basis translatorを2回目(つまりoutput = bt_pass(output)上記の例では)を修正する。 これはtranspile()関数を実行したときの出力には影響しないはずであり、パスを単独で実行した場合にのみ問題となる。
アップグレードの注意
-
このバージョンから、
from qiskit import *、サブモジュールはインポートされず、選択されたオブジェクトのリストのみがインポートされる。 これは、from qiskit import *、現在のネームスペースの一部ではないオブジェクトを参照している既存のコードを壊すかもしれない。 注意点として、import *はバッドプラクティスとみなされ、プロダクションコードでは使用すべきではない。 Qiskitは、このような悪習の影響を軽減する方法として、qiskit/__init__.pyに__all__を設定している。 あなたのコードでname '<something>' is not defined、from qiskit import <something>を追加して、もう一度試してみてください。 -
によって生成される最適化レベル0、1、2、3のプリセット・パス・マネージャー。
level_0_pass_manager(),level_1_pass_manager(),level_2_pass_manager()およびlevel_3_pass_manager()が無条件に実行されることはない。TimeUnitConversion. 以前は、プリセット・パス・マネージャーは、トランスパイラーや回路への入力に関係なく、常にこのパスを実行していた。 このパスが実行されるのは、scheduling_methodパラメーターが設定されているか、回路にDelay命令が含まれており、instruction_durationsパラメータが設定されている場合にのみ実行されます。 この変更は、ランタイム・パフォーマンスの観点から行われた。transpile()ゲート数が多く、遅延、タイミング、スケジューリングが使用されていない回路で実行する場合、実行時の性能のためにこの変更が行われました。TimeUnitConversionが最大のボトルネックになる可能性があるためです。 -
BIPMappingのデフォルト・メソッドはdepthではなくbalancedとなった。 この新しい目的は、回路の深さとゲート誤差の両方を考慮するため、一般に、より良い結果を達成する。 -
クラスの
sort_parameters_by_name。VQEクラスはQiskit Terra 0.18 で非推奨となったため、削除されました。 パラメータの新しい並び順は、より自然なソート順であるため、代替案は用意されていない。 -
回路引き出し
QuantumCircuit.draw()およびcircuit_drawer()latexオプションを使用すると、ファイル拡張子(ファイル名が指定されている場合)を決定する形式で画像が保存されるようになります。 以前は常にPNG形式で保存されていた。 画像フォーマットが不明な場合は、ValueError。 これは、画像をさまざまなフォーマットで保存しやすくするためだ。 -
コアの依存関係
retworkxのバージョン要件が 0.9 から 0.10.1 に引き上げられた。 これにより、さまざまなトランスパイルパスにまたがって、いくつかの性能向上が可能になる。 -
以前は非推奨だった
conditionkwargは、 0.15.0 リリースの一部として非推奨となった。DAGCircuit.apply_operation_back()そしてDAGCircuit.apply_operation_front(). 代わりに、condition属性をInstructionインスタンスにDAGCircuitに追加されるインスタンスにInstruction.c_if(). -
DAGCircuit.extend_back()メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりにDAGCircuit.compose()メソッドを使うことができる。 -
DAGCircuit.compose_back()メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりにDAGCircuit.compose()メソッドを使うことができる。 -
メソッドの
edge_mapkwargDAGCircuitメソッドのcompose()は削除された。 これはもともと、 0.14.0 リリースで非推奨となっていた。 このメソッドは、qubitsとclbitskwargs を受け取り、edge_mapが以前に提供した辞書マッピングを使う代わりに、合成するビットの位置順序を指定する。 -
DAGCircuit.twoQ_gates()メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりにDAGCircuit.two_qubit_ops()を使うべきである。 -
DAGCircuit.threeQ_or_more_gates()メソッドが削除されました。 これはもともと、 0.13.0 リリースで非推奨となっていた。 代わりにDAGCircuit.multi_qubit_ops()メソッドを使うべきである。 -
のコンストラクタの最初の位置引数の名前付きアクセスが削除された。
SingleQubitUnitaryuクラスのコンストラクタの最初の位置引数の名前付きアクセスが削除されました。 これはもともと、 0.14.0 リリースで非推奨となっていた。 その代わり、最初の位置引数はunitary_matrix(または、名前ではなく位置引数で設定する)。 -
メソッドの最初の位置引数に対する名前付きアクセス。
QuantumCircuitメソッドsquuに対する名前付きアクセスが削除されました。 これはもともと、 0.14.0 リリースで非推奨となっていた。 その代わりに、最初の位置引数をunitary_matrix(あるいは、名前ではなく位置引数で設定する)。 -
qiskit.qasm.nodeモジュールの QASM ノードクラスのqasm()メソッド用の未使用のprocおよびnested_scopekwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。 -
qiskit.qasm.nodeモジュールの QASM ノードクラスのlatex()メソッド用の未使用のprocおよびnested_scopekwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。 -
qiskit.qasm.nodeモジュールの QASM ノードクラスのreal()メソッド用の未使用のprocおよびnested_scopekwargs が削除されました。 これらはもともと、 0.15.0 リリースで非推奨となっていた。 -
の出力は
Statevector.draw()を使用する場合、"latex"の出力は、純粋に量子ビットで構成される状態をプロットする場合、新しい"ket"の規約になりました。 これは、ケット・ラベルを表示し、非ゼロ要素のみを表示するため、特に教育的な文脈で、出力を読みやすくするために変更された。 -
走行中
execute()バックエンドでBackendV1バックエンドで実行する場合、kwargsshots,max_credits,meas_level,meas_return,memory_slot_sizeのデフォルト値は、ターゲットとなるバックエンドのoptions属性で設定されているデフォルト値になります。 以前は、これらのデフォルト値は、レガシーな バックエンドでexecute()をレガシーなBaseBackendバックエンドでコールした場合のデフォルト値と同じに設定されていました。 例:from qiskit.test.mock import FakeMumbai from qiskit import QuantumCircuit, execute circuit = QuantumCircuit(2) qc.h(0) qc.cx(0, 1) qc.measure_all() backend = FakeMumbai() backend.set_options(shots=4096) execute(qc, backend)4096。 以前のリリースでは、1024。 -
Matplotlib の最小サポートバージョンは 2.1.0 から 3.3.0 に引き上げられた。 関数用の
'mpl'バックエンドなど、 Matplotlib - ベースの可視化関数を使用する場合は、 Matplotlib 3.3.0 をインストールする必要があります。circuit_drawer()関数やplot_bloch_vector()関数をインストールする必要があります。 1つ目は、 Matplotlib の最近のバージョンでは、 3D のビジュアライゼーションに関するAPIの使用が非推奨になり、古いリリースとの互換性がなくなったからです。2つ目は、matplotlib の上流依存関係によって互換性がなくなり、テストが難しくなったため、 Matplotlib の古いバージョンをインストールするのが難しくなったからです。 -
の乱数発生器の内部使用が調整された。
random_circuit()の乱数生成器の内部使用が調整され、固定シードでも以前のバージョンと出力が変わるようになった。 これは、使用される量子ビット数に応じて実行時間のスケーリングを大幅に改善するために行われた。 以前のバージョンと同じ出力に依存していた場合は、qpy_serialization.dump()を使って以前のバージョンで生成されたランダムな回路を保存し、新しいリリースでそれを再度生成する代わりに、qpy_serialization.load()を使って保存された回路をロードすることをお勧めします。 -
メソッドには
*(__mul__) を使用する。dot()メソッドに@(__matmul__) を使用する。compose()BaseOperatorのすべての演算子クラスの親である)。qiskit.quantum_infoやOperatorとPauliのようなクラスを含むすべての演算子クラスの親である)はサポートされなくなりました。 これらの演算子の使用は、 0.17.0 リリースで非推奨となっていた。 代わりにdot()とcompose()メソッドを直接使うか、&演算子 (__and__) を使ってcompose(). 例えば、以前は次のような演算子を使っていたとする:from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a @ op_bに変更すべきである:
from qiskit.quantum_info import random_hermitian op_a = random_hermitian(4) op_b = random_hermitian(4) new_op = op_a.compose(op_b)または:
new_op = op_a & op_b -
パルスプログラム命令のオペランドにパラメータを割り当てるさまざまな方法は、Qiskit Terra 0.17 で非推奨となり、削除されました。 次のものが含まれます。
pulse.Instructionのassign()メソッド。- のベースである
Channelのassign()メソッドである。AcquireChannel,SnapshotChannel,MemorySlotそしてRegisterSlot. pulse.Gaussian、pulse.GaussianSquare、pulse.Drag、pulse.ConstantのベースとなるParametricPulseのassign()とassign_parameters()メソッド。
これらのパラメータは、パルス・プログラム(
pulse.Scheduleおよびpulse.ScheduleBlock) から割り当てるべきである。 -
pulse.Instructionのflatten()メソッドは削除されました。qiskit.pulse.Scheduleメソッドは削除され、Qiskit Terra 0.17 からの非推奨通知に従って存在しなくなりました。 この変換は、qiskit.pulse.transforms.canonicalization.flatten()で独立した関数として定義されている。 -
qiskit.pulse.interfaces.ScheduleComponentは削除され、Qiskit Terra 0.15 からの非推奨の通知に従って、もはや存在しません。 代替クラスは用意されない。 -
レガシーのパルスドローワー引数は
pulse.Waveform.draw()から削除された、Schedule.draw()およびScheduleBlock.draw()から削除され、Qiskit Terra 0.16 からの非推奨の通知に従って存在しなくなりました。 これらの描画メソッドは、 V2 パルス描画引数のみをサポートするようになった。 詳細はメソッドのドキュメントを参照。 -
Qiskit Terra 0.14 からの非推奨通知により、
qiskit.pulse.rescheduleモジュールは削除され、このインポートパスは存在しなくなりました。 代わりにqiskit.pulse.transforms代わりに -
保護されたメソッド
Schedule._children()は削除され、Qiskit Terra 0.17 からの非推奨通知に従って、保護されたインスタンス変数に置き換えられました。 これは現在、パブリック属性として提供されています。Schedule.children. -
タイムスロットに関連するメソッドとプロパティは削除され、Qiskit Terra。
ScheduleBlockQiskit Terra 0.17 からの非推奨通知に従って。 この表現には命令時間(t0)の概念がないため、タイムスロット情報は、次のように変換された後に利用可能になる。Schedule. この変換の後、対応する属性が提供されたが、それらはもはやサポートされていない。 以下の属性が削除された:timeslotsstart_timestop_timech_start_timech_stop_timeshiftinsert
-
Qiskit Terra 0.17 からの非推奨通知に従い、アライメントパルススケジュール変換は削除され、もはや存在しません。 これらの変換は、スケジュールブロックの
AlignmentKindコンテキストに統合され、実装される。 以下の明示的な変換関数が削除された:qiskit.pulse.transforms.align_equispacedqiskit.pulse.transforms.align_funcqiskit.pulse.transforms.align_leftqiskit.pulse.transforms.align_rightqiskit.pulse.transforms.align_sequential
-
Qiskit Terra 0.17 からの非推奨通知に従い、冗長なパルスビルダーコマンドは削除され、もはや存在しません。
pulse.builder.call_scheduleとpulse.builder.call_circuitが統合された。pulse.builder.call(). -
すべてのQiskit非推奨警告を表示する原因となっていた内部フィルターオーバーライドが削除されました。 これは、 Python の非推奨の標準的な動作に戻ることを意味します。
DeprecationWarningが表示されるのは、メインスクリプトファイル、インタプリタセッション、または Jupyter ノートブック内のコードによってトリガーされた場合のみです。 Qiskitの内部関数が非推奨の振る舞いを呼び出した場合、ユーザーに警告が表示されることはなくなりました。 もしライブラリを書くのであれば、デフォルトの警告フィルタを無効にして実行することもあるし、常に無効にして実行するテストもあるはずだ。 その方法については、 Python の警告に関する文書、特に非推奨のテストに関するセクションを参照のこと。 -
以前は特定の警告は、たとえ複数の場所からトリガーされたとしても、一度しか発せられなかった。 この動作は削除されたため、非推奨の関数を呼び出した場合、以前よりも警告が多く表示される可能性がある。 非推奨の関数呼び出しは、将来のQiskitリリースで削除されるので、推奨バージョンに変更する必要があります。
-
非推奨の
qiskit.schemasモジュールと、スキーマから jsonschema バリデータを構築するqiskit.validationモジュールは削除されました。 これは 0.17.0 リリースで非推奨となり、 IBM Quantum API ペイロードスキーマ専用のリポジトリに置き換えられました。以前
qiskit.schemasにパッケージされていたスキーマファイルや、それをもとに作られたバリデータに依存していた場合は、そのリポジトリを使い、そこに含まれるスキーマファイルからバリデータを作る必要があります。 -
関数
qiskit.qobj.validate_qobj_against_schemaおよびqiskit.qobj.common.validatorとメソッドのvalidatekwargQasmQobj.to_dict(),PulseQobj.to_dict()とQobj.to_dict()は削除された。 これらは 0.17.0 リリースで非推奨となった。 これらの関数を使用していた場合は、 IBM Quantum API ペイロード・スキーマの専用リポジトリにある jsonschema ファイルを使用して、Qobjオブジェクト用の jsonschema 検証関数を手動で構築する必要があります。 -
qiskit-terra の要件リストに
fastjsonschemaとjsonschemaパッケージがなくなった。 jsonschemaの内部使用は削除され、qiskit-terraを使用する必要はなくなりました。 -
によって発生する例外。
assemble()関数の構築に無効なパラメータが渡されたときに発生する例外がPulseQobjがSchemaValidationErrorからQiskitError. これは、SchemaValidationErrorクラスが非推奨のqiskit.schemasやqiskit.validationと共に削除されたためである。 これはまた、他のエラー条件との整合性を保つためでもある。assemble()をすでに発生させていたQiskitError. -
トランスパイラ最適化レベル3のデフォルトのルーティングパスとレイアウトパスは、次のように変更されました。
SabreSwapとSabreLayoutを使用するように変更されました。 これは出力結果の質を向上させるために行われた。StochasticSwapとDenseLayoutを使うよりも良い結果が得られるからである。 この変更によりtranspile()またはexecute()optimization_level3関数を実行する際の結果の質が向上します。 これは一般的に改善されているが、何らかの理由で以前の動作を保持する必要がある場合は、routing_method="stochastic"とlayout_method="dense"を明示的に設定することで、これを行うことができる。transpile()をoptimization_level=3。 -
の戻り値の型は
pauli_basis()はPauliTableからPauliListに変更されます。 新しい動作に即座に切り替えるには、キーワード引数pauli_list=Trueを渡す。 -
の
name属性がSingleQubitUnitaryの属性がunitaryからsquに変更された。 これは、unitary、UnitaryGateクラスの名前との衝突を避けるために必要だった。2つのゲートは同じではないし、同じインプリメンテーションを持っているわけでもないからだ(そして互換性を持って使うことはできない)。 -
インストールに必要な Symengine の最小バージョンが 0.8.0 に上がりました。 これは、
numpy.float16とnumpy.float32の値の処理に関するいくつかの問題を修正するために必要であった。bind()のパラメータをバインドするためにParameterExpression. -
要件リストに新たな従属港湾労働者が追加された。 これはqiskit-terraが必要とするもので、ユニタリー合成プラグイン・インターフェースの構築に使用される。
非推奨のメモ
-
の
gate属性と初期化パラメータは非推奨。qiskit.transpiler.passes.Decomposeは非推奨であり、将来のリリースで削除される予定です。 この単一のゲートの代わりに、ゲート名のリストを新しいパラメータgates_to_decomposeに渡す必要がある。 これは、新しいフォームでは分解対象として複数のゲートを選択できるため、より柔軟性が増し、ゲートのセットを分解するために何度もパスを再実行する必要がなくなるためである。 -
キャリブレーションに関して、大幅なトランスパイラー・パスの再編成が行われた。 インポートパス:
from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilder from qiskit.transpiler.passes.scheduling.calibration_creators import RZXCalibrationBuilderNoEchoは非推奨であり、将来のリリースで削除される予定です。 インポートパス:
from qiskit.transpiler.passes.scheduling.rzx_templates import rzx_templatesも非推奨であり、将来のリリースで削除される予定です。 新しいインポートパスを使うべきだ:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.transpiler.passes import RZXCalibrationBuilderNoEcho from qiskit.transpiler.passes.calibration.rzx_templates import rzx_templates -
この
DAGNodeの親クラスとしてのみ使用されます。DAGOpNode,DAGInNodeおよびDAGOutNode. この非推奨化の一環として、以下のkwargsとDAGNodeの以下のkwargsと関連する属性も非推奨となる:typeopおよびwire。 -
のコンストラクタでは
RZXCalibrationBuilderのコンストラクタで、バックエンドを最初の位置引数として渡すか、backendkwarg を指定することは推奨されません。 代わりにInstructionScheduleMapをinstruction_schedule_mapkwarg に直接渡し、各クォビットのチャンネル名リストのリストをqubit_channel_mappingに直接渡すべきである。 例えば、パスをこう呼ぶとする:from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() cal_pass = RZXCalibrationBuilder(backend)その代わり、こう呼ぶべきだ:
from qiskit.transpiler.passes import RZXCalibrationBuilder from qiskit.test.mock import FakeMumbai backend = FakeMumbai() inst_map = backend.defaults().instruction_schedule_map channel_map = self.backend.configuration().qubit_channel_mapping cal_pass = RZXCalibrationBuilder( instruction_schedule_map=inst_map, qubit_channel_mapping=channel_map, )この変更が必要な理由は、一般的なルールとして、バックエンドのオブジェクトはpickleシリアライズ可能ではない。
transpile()の中で複数のプロセスで使用すると壊れてしまうからです。 -
の
labelプロパティは、クラスMCMTおよびサブクラスMCMTVChainのプロパティは非推奨となり、将来のリリースで削除される予定です。 その結果、両クラスのコンストラクタのlabelkwargも、メソッドのlabelkwargとともに非推奨となる。MCMT.control(). 現在、labelプロパティは、制御対象が複数のターゲット量子ビットで構成されている場合に、制御対象の名前に使用されます。しかし、これはユーザーが指定できることを意図したものではなく、よく知られた演算の名前が使用された場合、誤ったMCMTゲートになる可能性があります。 非推奨になった後、labelプロパティはユーザーが指定できるものではなくなります。 ただし、生成された制御対象の名前はMCMT.data[0][0].base_gate.name -
クラスの
subgraph()メソッドは非推奨です。CouplingMapクラスのメソッドは非推奨であり、将来のリリースで削除される予定です。 代わりにreduce()メソッドを使うべきである。CouplingMap(subgraph()はリストの順序を保持しなかった)。 -
のインスタンスを作成する。
InstructionSetcircuit_cregsのインスタンスを作成することは非推奨です。 一般的に、これらのクラスはユーザーによって構築される必要はありません(内部的に使用されます)が、必要な場合は、resource_requesterキーワード引数として callable を渡す必要があります。 例:from qiskit.circuit import Clbit, ClassicalRegister, InstructionSet from qiskit.circuit.exceptions import CircuitError def my_requester(bits, registers): bits_set = set(bits) bits_flat = tuple(bits) registers_set = set(registers) def requester(specifier): if isinstance(specifer, Clbit) and specifier in bits_set: return specifier if isinstance(specifer, ClassicalRegster) and specifier in register_set: return specifier if isinstance(specifier, int) and 0 <= specifier < len(bits_flat): return bits_flat[specifier] raise CircuitError(f"Unknown resource: {specifier}") return requester my_bits = [Clbit() for _ in [None]*5] my_registers = [ClassicalRegister(n) for n in range(3)] InstructionSet(resource_requester=my_requester(my_bits, my_registers)) -
クラスのコンストラクタの
measurement_error_mitigation_clskwargの値として、qiskit-ignisの計測緩和クラスqiskit.ignis.mitigation.CompleteMeasFitterとqiskit.ignis.mitigation.TensoredMeasFitterを使用することは非推奨である。QuantumInstanceクラスのコンストラクタの kwarg の値としての使用は非推奨であり、将来のリリースで削除される予定です。 その代わりにqiskit.utils.mitigation,CompleteMeasFitterおよびTensoredMeasFitterの同等のクラスを使うべきである。 これは、qiskit-ignisプロジェクトが非推奨となり、近い将来サポートされなくなるため、必要なことだった。 注目に値するのは、qiskit-ignisの同等クラスとは異なり、以下のバージョンであることだ。qiskit.utils.mitigationのバージョンはQuantumInstance(つまり、measurement_error_mitigation_clskwargを使ったインスタンスではなくクラスとして)使用することのみがサポートされており、スタンドアローンでの使用は意図されていない。 -
Optimizer.optimize()すべてのオプティマイザ (Optimizerおよび派生クラス) のための メソッドは現在非推奨となっており、将来のリリースで削除される予定です。 代わりにOptimizer.minimize()SciPy’sminimize()関数のシグネチャを模倣したメソッドを使うべきである。現在のoptimizeコールをminimizeに置き換えるには、次のように置き換える
xopt, fopt, nfev = optimizer.optimize( num_vars, objective_function, gradient_function, variable_bounds, initial_point, )への
result = optimizer.minimize( fun=objective_function, x0=initial_point, jac=gradient_function, bounds=variable_bounds, ) xopt, fopt, nfev = result.x, result.fun, result.nfev -
qiskit.utilモジュールをインポートすると、DeprecationWarning。 その代わりに、同じ機能をすべてqiskit.utils. Terra 0.17 以降、utilモジュールは非推奨となったが、以前は警告は出なかった。 Terra 0.20 で削除される。 -
プロパティ
tableは非推奨であり、将来のリリースで削除される予定です。 これはSparsePauliOpは内部的にPauliTableの代わりにPauliListを使うように更新されたからである。 これはパフォーマンスを大幅に向上させるためだ。 これでPauliListデータにはSparsePauliOp.paulis属性を使用してデータにアクセスする必要があります。
バグ修正
-
多くのレイアウト・メソッドが3つ以上の量子ビット・ゲートを無視するため、予期しないレイアウト割り当てが決定されるバグを修正。 トランスパイラパス
Unroll3qOrMoreが呼び出されたとき、すべてのプリセットパスマネージャでレイアウトパスの前に実行されるようになりました。transpile()が呼び出されたとき、すべてのプリセットパスマネージャでレイアウトパスの前に実行されるようになりました。 修正 #7156。 -
分解された回路は、アセンブルされた回路や実験回路からキャリブレーションを引き継ぐ。
QasmQobjと実験を継承します。 5348を修正。 -
インスタンスの
ansatzまたはoptimizer属性をVQEインスタンスの属性をNoneに設定すると、バグっぽい動作になるのを修正しました。 詳細は #7093を参照。 -
の追加を修正した。
PauliListをqargs。 オペランドの量子ビット数が異なる場合に実行時エラーを発生させる方法。 -
を使用して勾配を計算しようとするとエラーが発生する問題を修正しました。
CircuitGradientクラスで勾配を計算しようとするとエラーが発生する問題を修正しました。 このバグ修正は、指定されたゲートを、要求された勾配法でサポートされるゲートの集合に変換する。 6918を修正。 -
メソッドでエラー軽減を使用した場合の校正結果を削除した。
execute()メソッドで誤差軽減を使用した場合の校正結果を削除しました。QuantumInstance. 7129を修正。 -
を実行したときに表示される非推奨の警告を修正した。
QuantumCircuit.draw()またはcircuit_drawer()1.9expr_free_symbols()を実行しているときに表示される非推奨の警告を修正しました。 回路図作成者は以前、記号定数のインスタンスを見つけるときにこの方法を利用していた。 -
mplサーキットドロワーのaxkwarg およびstylekwarg のfigwidthオプションが正しく拡大縮小されない問題を修正。 ユーザーは、 Matplotlib サブプロットからmpl回路ドロワーにaxを渡すことができ、回路はそのサブプロットの境界内に描かれる。 あるいは、styledict kwargでfigwidthをインチ単位で設定すると、図面は設定されたインチ単位の幅に拡大縮小されます。 修正 #6367。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.latexドロワー・オプションを使用して、レジスタではなくクラシカル・ビットを対象としたmeasure命令を表示すると、ドロワーが失敗する。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.mpl、latex、textの3つの引き出しオプションのいずれでも、古典的な条件を持つゲートが、レジスタなしで古典的なビットを条件とするゲートに遭遇した場合、引き出しは失敗する。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.mpl、latex、textの3つの引き出しオプションのいずれかで、古典的条件を持つゲートがmeasureと同じ古典的ビットを条件とし、メジャーがターゲットとするビットにレジスタがない場合、引き出しは失敗する。 -
C3SXGateこれで正しい分解と行列表現が可能になった。 以前は、意図したSXGate().control(3)ではなく、SdgXGate().control(3)と同等だった。 -
qiskit.test.mock.utils.ConfigurableFakeBackendのメンバーnameはbackend_nameに変更された。 これはname()メソッドとの衝突を避けるためである。BackendV1クラスから継承したメソッドとの衝突を避けるためである。 これにより、ConfigurableFakeBackendBackendV1オブジェクトと互換性があります。 しかし、以前name属性を直接使用していた場合は、メソッドとして呼び出すか、代わりにbackend_name属性にアクセスする必要があります。 -
が含まれる回路で
QuantumCircuit.decompose()を含む回路上でInstruction属性が空のdefinition属性が空である回路を呼び出すと、その命令がゼロオペレーションに分解されず、そのままになってしまう問題を修正しました。 例えば、サーキットがある:from qiskit.circuit import QuantumCircuit empty = QuantumCircuit(1, name="decompose me!") circuit = QuantumCircuit(1) circuit.append(empty.to_gate(), [0])以前は、
circuit.decompose()。 これで、emptyをゼロ命令に正しく分解することができる。 詳しくは #6997を参照。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.mplまたはlatexオプションを使用して、古典的なconditionを含むmeasure命令を表示する場合、condition情報がmeasure表示を上書きすることがあった。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.mplのドロワーは、conditionの値を表示するために16進数表記を使用したが、textとlatexのドロワーは10進数表記を使用した。 これで3つの引き出しはすべて16進数表記になった。 -
Hoareオプティマイザーの転置パスのバグを修正。ゲートが前任者と後任者の両方と別々に結合されて同一性を形成できる場合、ゲートを2回削除しようとすることがあった。 詳細は #7271を参照。
-
標準的な
InstructionSet.c_if()メソッドで条件付き命令を作成する場合、整数インデックスはQuantumCircuitで使用されている番号付けと一致するようになった。 以前はClassicalRegisterが重なった場合Clbitが重なると、番号付けがおかしくなっていた。 詳細は #7246を参照。 -
標準的な
InstructionSet.c_if()メソッドで条件付き命令を作ると、回路内にClassicalRegisterがなくても成功するようになった。 詳細は #7250を参照。 -
標準的な方法で命令を条件付きにする
InstructionSet.c_if()メソッドで条件付き命令を作成する。Clbitサイズ1のClassicalRegisterを使用する場合、標準的な方法で条件付き命令を作成すると、レジスタではなくビットに対する条件が正しく作成されるようになります。 詳細は #7255を参照。 -
標準の
InstructionSet.c_if()メソッドで条件付き命令を作ろうとすると、古典的リソースが回路に存在しない場合、正しくエラーが発生するようになりました。 詳細は #7255を参照。 -
Matplotlib 3.5 との互換性の問題を修正しました。
plot_bloch_vector. 詳細は #7272を参照。 -
メソッドでレイヤーが正しく追加されない問題を修正しました。
NLocal.add_layer()オブジェクトがすでに構築されている場合NLocalオブジェクトがすでにビルドされている場合に -
をピックする際の問題を修正しました。
InstructionScheduleMapPython 3.6 を使用している場合に発生する問題を修正した。 詳細は #6944を参照。 -
symengine での複雑な値のパルスパラメータの割り当てが修正されました。 例:
from qiskit import circuit, pulse import numpy as np amp = circuit.Parameter("amp") phase = circuit.Parameter("phase") with pulse.build() as sched: pulse.play(pulse.Gaussian(160, amp * np.exp(1j * phase), 40), pulse.DriveChannel(0)) sched.assign_parameters({amp: 0.1, phase: 1.57}, inplace=True)0.18.0 リリースで
symengineの使用が導入された後、割り当てられた振幅はParameterExpression(0.1*exp(1.57*I))として表示されている。 これは正しく評価され、7.96327e-05 + 0.0999999683jとして表示される。 -
以下の問題を修正した。
QAOA.construct_circuit()同じ量子ビット数で異なる演算子を使用した場合、毎回同じ回路が生成されてしまう問題を修正しました。 詳細は #7223を参照。 -
以下の問題を修正した。
QAOAAnsatzPauliSumOp.from_list([("III", 1)])のように、PauliSumOpのIDが指定された場合、パラメーターの数が不正確になる問題を修正した。 詳細は #7225を参照。 -
メソッドが無効な識別子を返すことがあったバグを修正した。
QuantumCircuit.qasm()メソッドが無効な識別子を持つ OpenQASM 2 命令を返すことがあるバグを修正した。 同じバグがUnitaryGateで修正された。 -
レジスタレスビットを表示しようとすると、
mpl、latex回路ドロワーが故障する問題を修正。text、レジスタレス・ビットの番号表示から先頭の_が削除された。 修正 #6732。 -
1ビット・レジスタでは、すべての回路ドロワがレジスタ名のみを表示し、
0の添え字を表示しなくなった。 修正 #5784。 -
の暗黙レジスタの名前の衝突を修正。
QuantumCircuit.qasmの名前の衝突を修正しました。 以前は、レジスタのない量子ビットと clbits は、衝突があるにもかかわらず、reglessと呼ばれるqregとcregの両方に入れられた。 これらのレジスタは、決定論的に生成された個別の名前を持つことになり、回路内のユーザー定義レジスタ名と衝突することはない。 -
clbits演算を伴う回路(測定、条件ゲート、更新など)のスケジューリングに関する問題を修正。
ASAPSchedule,ALAPScheduleおよびAlignMeasures. 更新されたスケジューラは、すべてのclbitのI/O操作に時間がかからないと仮定し、measure、最後に測定値をclbitに書き込み、c_if、最初に条件値をclbit(s)で読み込む。 修正 #7006。 -
空のリストに対して
transpileを呼び出すと、警告を出さずに正しく空のリストを返すようになった。 7287を修正。 -
の問題を修正した。
PiecewiseChebyshevの問題を修正しました。 このような場合は、次のように関数を使うのではなく、f_xの引数として定数を直接渡すようにする:from qiskit.circuit.library.arithmetic import PiecewiseChebyshev PiecewiseChebyshev(1.0, degree=3)詳細は #6707を参照。
-
もし
HHLアルゴリズムのインスタンスがQuantumInstance(デフォルト)なしで構築された場合、後でインスタンスを読み込んだり設定したりするためにゲッターとセッターのプロパティを使用しようとすると失敗します。 ゲッターとセッターは期待通りに動作するようになった。 -
この
QuantumCircuit.qasm()メソッドは、circuit.dataに存在する元の命令ではなく、回路に存在する命令のコピーの名前を編集するようになった。 詳細は #6952を参照。 -
のバグを修正した。
PauliSumOp.permute()エラーを引き起こすQiskitError: 'Pauli string label "" is not valid.'順列が同じ数のパウリ項を持つ場合。
X ^ Y ^ Zでpermute([2, 1, 0])を呼び出してもエラーは発生しなくなり、Z ^ Y ^ Xを返すようになった。 -
のミキサー・パラメーターのパラメーター境界が設定されていなかったバグを修正。
QAOAAnsatzのパラメータ境界が設定されていなかったバグを修正した。 -
パスにおける最終的なオペレーション(障壁と対策)の固定的な決定
RemoveFinalMeasurementsとメソッドremove_final_measurements()クラスのQuantumCircuit以前は出力ノードの直前のノードだけを考慮していました。 -
パスとメソッドにおける最終操作の確定
RemoveFinalMeasurementsとメソッドremove_final_measurements()クラスのQuantumCircuitでの最終操作の判定を修正した。 -
パスのマルチビット古典レジスタ除去を修正
RemoveFinalMeasurementsとメソッドremove_final_measurements()クラスのQuantumCircuitにおいて、他のビットがアイドル状態であっても、各ビットに最終的な対策が施されない限り、古典レジスタが削除されなかった問題を修正した。 現在、最終的な測定とバリアーを取り除いた結果、アイドルになった古典的なレジスタは常に取り除かれる。 古典的なビットは、削除されたレジスタによってのみ参照されるか、まったく参照されず、削除によってアイドルとなった場合に削除される。 この修正により、基礎ビットを共有するレジスタの適切な処理も追加された。 -
の問題を修正した。
RemoveFinalMeasurementsの問題を修正しました。DAGCircuitが無効になってしまう問題を修正しました。 詳細は #7196を参照。 -
メソッドの問題を修正しました。
remove_final_measurements()クラスのQuantumCircuitメソッドの問題を修正しました。QuantumCircuit.clbitsのメソッドが不正になる問題を修正しました。 詳細は #7089を参照。 -
で空のゼロ演算子をテーパリングする際、それがゼロであることを検出すると、コードは警告を記録し、元の演算子を返した。
qiskit.opflowで空のゼロ演算子をテーパリングすると、それがゼロであることを検出したコードは警告を記録し、元の演算子を返した。 このような演算子は、Qiskit Natureを使用する場合、補助演算子で一般的に見られます。上記の動作により、VQE、テーパーされた非ゼロ演算子はテーパーされたゼロ演算子とは異なる量子ビット数であったため、例外がスローされました(テーパーは入力演算子を変更せずに返したため)。 コードはゼロ演算子を正しくテーパリングするようになり、予想通り量子ビット数が減少し、テーパリングされた非ゼロ演算子にマッチします。例えば、3量子ビットでテーパリングする場合、`0*"IIII"`は0*"I"になります。 -
メソッドの問題を修正しました。
draw()メソッドとcircuit_drawer()settings.conf関数の問題を修正しました 関数/メソッドのstylekwargが設定されていない場合、circuit_mpl_styleフィールドの設定値は無視される。
その他の注意事項
-
に対する文字列キャストは
qiskit.circuit.ParameterExpressionはもう完全な精度を持たない。 これは、floatにバインドされたパラメータを印刷する際に、末尾の 0s を削除する。 これはQASMのシリアライゼーションと回路テキストドロワーに影響を与えます:>>> from qiskit.circuit import Parameter >>> x = Parameter('x') >>> str(x.bind({x:0.5})) '0.5' # instead of '0.500000000000000' -
が更新された。
QAOAAnsatzは、QAOA文献の標準的な表記法であるように、コスト演算子にはパラメータ記号γ、ミキサー演算子にはβを使用するように更新された。
エア 0.9.1
変更なし
イグニス 0.7.0
前奏曲
このリリースはQiskit Ignisプロジェクトを非推奨とし、 Qiskit Experiments プロジェクトに取って代わられ、活発な開発は終了しました。 非推奨ではあるが、ユーザーがIgnisから移行するのに十分な機会を提供するため、重要なバグ修正と互換性の修正は引き続き行われる。 非推奨期間終了後(このリリースから3ヶ月以内)、プロジェクトは引退し、アーカイブされる。
新機能
-
のフィッティング・ルーチンを使用するよう、認定プロトコルを更新した。 https://arxiv.org/abs/2103.06603.
AccreditationFitterは、 FullAccreditation (旧プロトコル)と MeanAccreditation (新プロトコル)のメソッドを持つようになった。 データ入力は、結果オブジェクト( AppendResult )または文字列リスト( AppendStrings )を使用するように変更された。qiskit.ignis.verification.QOTPCorrectString()も追加された。 -
シンドロームグラフの高速分析生成オプションを追加。
RepetitionCodeに新しいブール引数bruteが追加され、ブルートフォース法を引き続き使用できるようになった。 これを容易にするためにヘルパークラスRepetitionCodeSyndromeGeneratorが追加された。 -
RepetitionCodeにキーワード引数resetsとdelayが追加された。 前者は、測定後にリセットゲートを挿入するかどうかを決定する。 後者では、各測定(場合によってはリセット)後の遅延時間(dt)を指定することができる。RepetitionCodeのsyndrome_measurement()メソッドにキーワード引数finalとdelayが追加された。 前者は、グローバルresetsに従ってリセットゲートを追加するか、シンドローム測定の最終ラウンドのために適切な動作で上書きするかを決定する。 後者では、各測定(場合によってはリセット)後の遅延時間(dt)を指定することができる。 -
RepetitionCodeクラスがx基底状態でのエンコーディングをサポートするようになった。 これは、RepetitionCodeオブジェクトを構築する際に、xbasisキーワード引数を設定することで使用できる。
アップグレードの注意
-
RepetitionCodeのsyndrome_measurement()メソッドからキーワード引数resetが削除された。 これは、クラスに対するグローバルなキーワード引数resetsと、syndrome_measurementに対するキーワード引数finalで置き換えられる。 以前は最終リセットゲートを避けるためにreset=Falseを使って最終測定ラウンドを追加していた場合、現在はfinal=Trueを使うべきである。 -
update_u_gates()からParametrizedScheduleを削除する。ParametrizedScheduleはQiskit-terra 0.17.0 の一部として非推奨となり、次のリリースで削除される予定です。 この関数は、未割り当てのParameterオブジェクトを含むScheduleプログラムでu ゲートを更新するようになった。
非推奨のメモ
-
AccreditationFitter、bound_variation_distanceとsingle_protocol_runというメソッドを廃止する -
Qiskit Ignisプロジェクトは全体として非推奨となり、プロジェクトは今後引退し、アーカイブされる予定です。 非推奨ではありますが、互換性の修正と致命的なバグの修正のみが行われます。 Qiskit Ignisを使用する代わりに、 Qiskit Experimentsを使用するように移行する必要があります。 移行ガイドを参照してください:
https://github.com/qiskit-community/qiskit-ignis#migration-guide