Qiskit 0.28 リリースノート
0.28.0
Terra 0.18.0
前奏曲
このリリースには多くの新機能とバグ修正が含まれています。 今回のリリースの目玉は、2つの新しいトランスパイラー・パス、 BIPMapping と DynamicalDecouplingパスの新しい pulse_optimize kwargと組み合わせると、次のようになります。 UnitarySynthesis パス上の新しい kwarg と組み合わせると、Quantum Volume 64 の結果を、: https://arxiv.org/abs/2008.08571. これらの新しいトランスパイラー・パスとオプションは、あらゆる回路の最適化にも一般的に適用できる。
新機能
-
の
measurement_error_mitgationkwargがQuantumInstanceコンストラクタのkwargは、すでにサポートされていたCompleteMeasFitterに加えて、qiskit-ignisのTensoredMeasFitterクラスに設定できるようになりました。TensoredMeasFitterを使用する場合、TensoredMeasFitterを使用する量子ビットを指定するために、新しいmit_patternkwarg を設定することもできます。TensoredMeasFitterのドキュメンテーションにあるmit_patternのドキュメンテーションを参照すると、期待されるフォーマットがわかります。 -
の
basiskwargで指定される単一量子ビットゲートの分解法は、 基底も含むように拡張された。OneQubitEulerDecomposerの kwargで指定された単一量子ビットゲートの分解法は、'ZSXX'基底も含むように拡張されました。 ゲートだけでなく、直接 ゲートも利用できます。 -
新しいパスを2つ追加
AlignMeasuresとValidatePulseGatesを追加した。qiskit.transpiler.passesモジュールに追加した。 これらのパスは、ハードウェアを意識した最適化と、バックエンドの命令の時間割り当てに関するアライメント制限を管理するために使用される検証ルーチンである。バックエンドが
Measure命令のアライメントに制約を持つ場合(時間的な量子化という意味で)、パスが使用されます。AlignMeasuresパスがスケジュールされた回路の遅延を調整するために使用され、回路内のすべてのMeasure命令がバックエンドの制約に従って整列されるようにします。 パスはValidatePulseGatesパスは、カスタムパルスゲート(カスタムパルス定義をcalibrationsオブジェクトのQuantumCircuitオブジェクトの属性にカスタムパルス定義を持つゲート)がターゲットバックエンドのアライメント制約を与えられたときに有効かどうかをチェックするために使われます。で使用される組み込み
preset_passmangers。transpile()関数では、アラインメント制約が、timing_constraintskwarg ontranspile()timing_constraintsを使うかBackendConfiguration属性を持つ場合、これらのパスは自動的にトリガーされます。IBM Quantum Services のバックエンド( qiskit-ibmq-provider パッケージ経由でアクセス可能)は、近い将来アライメント情報を提供する予定である。
例:
from qiskit import circuit, transpile from qiskit.test.mock import FakeArmonk backend = FakeArmonk() qc = circuit.QuantumCircuit(1, 1) qc.x(0) qc.delay(110, 0, unit="dt") qc.measure(0, 0) qc.draw('mpl')qct = transpile(qc, backend, scheduling_method='alap', timing_constraints={'acquire_alignment': 16}) qct.draw('mpl') -
で説明されているようなBIP(2値整数計画)問題を解くことによって、最適なレイアウトとルーティングを一度に見つけようとする新しいトランスパイラ・パスクラス
qiskit.transpiler.passes.BIPMapping。 arXiv:2106.06446 が追加されました。BIPMappingパス("レイアウトとルーティング "を意味する "マッピング "という名前)は、マッピング問題をBIP(2値整数計画)問題として表現し、BIP問題を解くためにCPLEX (cplex)に依存している。 CPLEXを含む依存ライブラリはqiskit-terraと一緒にインストールできます:pip install qiskit-terra[bip-mapper]CPLEXの無料版では、小規模なBIP問題、すなわち約5量子ビット未満の回路のマッピングしか解くことができないため、より大規模な回路のマッピングにはCPLEXの有料版が必要になる可能性がある。
BIPマッパーは、量子ビットやゲートの数に対してひどくスケールする。 例えば、10量子ビットを超える
coupling_map、BIPソルバー(CPLEX)はデフォルトの制限時間内に解を見つけることができないため、動作しない。マッピングで使用する物理量子ビットを固定したい場合(量子ボリューム(QV)回路の実行など)、使用する量子ビットのみを含む
coupling_map。以下は、QV回路をトランスパイルするためのパス・マネージャーを構築する最小限のサンプル・コードである:
num_qubits = 4 # QV16 circ = QuantumVolume(num_qubits=num_qubits) backend = ... basis_gates = backend.configuration().basis_gates coupling_map = CouplingMap.from_line(num_qubits) # supply your own coupling map def _not_mapped(property_set): return not property_set["is_swap_mapped"] def _opt_control(property_set): return not property_set["depth_fixed_point"] from qiskit.circuit.equivalence_library import SessionEquivalenceLibrary as sel pm = PassManager() # preparation pm.append([ Unroll3qOrMore(), TrivialLayout(coupling_map), FullAncillaAllocation(coupling_map), EnlargeWithAncilla(), BarrierBeforeFinalMeasurements() ]) # mapping pm.append(BIPMapping(coupling_map)) pm.append(CheckMap(coupling_map)) pm.append(Error(msg="BIP mapper failed to map", action="raise"), condition=_not_mapped) # post optimization pm.append([ Depth(), FixedPoint("depth"), Collect2qBlocks(), ConsolidateBlocks(basis_gates=basis_gates), UnitarySynthesis(basis_gates), Optimize1qGatesDecomposition(basis_gates), CommutativeCancellation(), UnrollCustomDefinitions(sel, basis_gates), BasisTranslator(sel, basis_gates) ], do_while=_opt_control) transpile_circ = pm.run(circ) -
に新しいコンストラクタ・メソッド
initialize_from()が追加された。ScheduleとScheduleBlockクラスに追加された。 このメソッドは、他のスケジュールから属性を取得する新しい空のスケジュールを初期化します。 例:sched = Schedule(name='my_sched') new_sched = Schedule.initialize_from(sched) assert sched.name == new_sched.name -
関数に新しいクワーグ、
line_disciplineが追加された。job_monitor()関数に追加された。 このkwargは、job_monitor出力で使用されるキャリッジ・リターン文字を変更することができる。line_disciplinekwargのデフォルトは'\r'。 -
抽象的な
Pulseクラス(これは、次のようなクラスの親クラスです。Waveform,ConstantそしてGaussianコンストラクタに新しいkwarg、limit_amplitudeが追加されました。Falseに設定することで、これまでハードコードされていた振幅制限1を無効にすることができます。 これは、パルス・クラスのグローバル・デフォルトを変更するために、クラス属性として直接設定することもできます。 例:from qiskit.pulse.library import Waveform # Change the default value of limit_amplitude to False Waveform.limit_amplitude = False wave = Waveform(2.0 * np.exp(1j * 2 * np.pi * np.linspace(0, 1, 1000))) -
新しいクラス
PauliListがqiskit.quantum_infoモジュールに追加された。 このクラスは、演算子のリストを効率的に表現するために使われます。Pauli演算子のリストを効率的に表現するために使用されます。 この新しいクラスは、既存のPauliTableと同じ親クラスから派生したものである(したがって、ほとんど互換性をもって使用できる)が、PauliTableと異なるのは、このクラスが のフェーズを扱えることである。qiskit.quantum_info.PauliListクラスは Z4 フェーズを扱うことができるからです。 -
新しいトランスパイラー・パスを追加、
RemoveBarriersを追加した。qiskit.transpiler.passes. このパスは、回路内のすべての障壁を取り除くために使用される。 -
新しいオプティマイザー・クラスを追加する、
SciPyOptimizerを追加する。qiskit.algorithms.optimizersモジュールに追加します。 このクラスは、scipy.optimize.minimize関数 (ドキュメント )のシンプルなラッパークラスで、scipy.optimize.minimizeでサポートされているすべての最適化ソルバーとすべてのパラメータ(コールバックなど)を使用することができます。 例:from qiskit.algorithms.optimizers import SciPyOptimizer values = [] def callback(x): values.append(x) optimizer = SciPyOptimizer("BFGS", options={"maxiter": 1000}, callback=callback) -
パスは
HoareOptimizerパスが改良され、すべての制御量子ビットが 状態の場合、ベース・ゲートと回路内のControlledGateに置き換えることができるように改良されました。 -
つの新しいメソッドを追加、
is_successor()そしてis_predecessor()を追加した。DAGCircuitクラスに追加した。 これらの関数は、あるノードが他のノードの後継か前任かをチェックするのに使われる。DAGCircuit. -
新しいトランスパイラー・パスが追加された、
RZXCalibrationBuilderNoEchoモジュールが追加された。qiskit.transpiler.passesモジュールに追加された。 このパスは、既存のRZXCalibrationBuilderRZXGate(theta)の校正を作成するという点で、既存のパスと類似している。RZXCalibrationBuilderNoEchoは、パルス・スケジュールにエコー・パルスを挿入することなくこれを行う。 これにより、クロス共振シーケンスのエコーをゲートとして露出させ、トランスパイラで簡略化することができる。 パスはRZXCalibrationBuilderNoEchoパスは、ハードウェア・ネイティブの方向であるCXGate. -
のメソッドに新しいクワーグ、
wrapが追加された。compose()メソッドに追加された。QuantumCircuit. これにより、構成された回路を命令にラップするかどうかを選択することができる。 デフォルトではFalse、つまりラッピングはしない。 例:from qiskit import QuantumCircuit circuit = QuantumCircuit(2) circuit.h([0, 1]) other = QuantumCircuit(2) other.x([0, 1]) print(circuit.compose(other, wrap=True)) # wrapped print(circuit.compose(other, wrap=False)) # not wrapped -
新しい属性、
control_channelsが追加された。PulseBackendConfigurationクラスに追加されました。 この属性は、バックエンドの制御チャンネルを、オブジェクトのリストへの量子ビットのマッピングとして表します。ControlChannelオブジェクトへのマッピングとして表します。 -
Isometryクラスのコンストラクタに新しいクワーグepsilonが追加された。QuantumCircuitメソッドisometry(). このkwargは、Isometryゲートで使用されるεトレランスをオプションで設定できる。 例:import numpy as np from qiskit import QuantumRegister, QuantumCircuit tolerance = 1e-8 iso = np.eye(2,2) num_q_output = int(np.log2(iso.shape[0])) num_q_input = int(np.log2(iso.shape[1])) q = QuantumRegister(num_q_output) qc = QuantumCircuit(q) qc.isometry(iso, q[:num_q_input], q[num_q_input:], epsilon=tolerance) -
トランスパイラー・パスを追加、
DynamicalDecouplingを追加しました。qiskit.transpiler.passesを追加しました(物理量子ビットへのマッピングとスケジューリングの後)。 このパスにより、DDゲートのシーケンス、ゲート間の間隔、適用する量子ビットを制御することができる。 例:from qiskit.circuit import QuantumCircuit from qiskit.circuit.library import XGate from qiskit.transpiler import PassManager, InstructionDurations from qiskit.transpiler.passes import ALAPSchedule, DynamicalDecoupling from qiskit.visualization import timeline_drawer circ = QuantumCircuit(4) circ.h(0) circ.cx(0, 1) circ.cx(1, 2) circ.cx(2, 3) circ.measure_all() durations = InstructionDurations( [("h", 0, 50), ("cx", [0, 1], 700), ("reset", None, 10), ("cx", [1, 2], 200), ("cx", [2, 3], 300), ("x", None, 50), ("measure", None, 1000)] ) dd_sequence = [XGate(), XGate()] pm = PassManager([ALAPSchedule(durations), DynamicalDecoupling(durations, dd_sequence)]) circ_dd = pm.run(circ) timeline_drawer(circ_dd) -
その
QuantumCircuitメソッドqasm()メソッドには新しいkwarg、encodingがあり、これを使うと関数が生成する出力QASMファイルの文字エンコーディングを任意に設定することができます。 これは、 Python 標準ライブラリのコーデック・モジュールの有効なコーデックまたはエイリアス文字列に設定できる。 -
新しいクラスを追加、
EvolvedOperatorAnsatzを追加した。qiskit.circuit.libraryモジュールを追加した。 このライブラリ回路は、以前は Qiskit Natureにあったもので、進化時間が変分パラメータである時間発展演算子で構成されるアンサッツ回路を構築するのに使うことができる。 このようなアナザッツ回路の例としては、Qiskit NatureのchemistryモジュールにあるUCCSDクラスやQAOAAnsatzクラスがある。 -
新しい偽のバックエンド・クラスが
ibmq_guadalupeバックエンドのためにqiskit.test.mockで利用可能です。 他のフェイクバックエンドと同様、これにはキャリブレーションデータのスナップショットが含まれる(すなわち、backend.defaults()) およびエラーデータ(すなわちbackend.properties()) 実際のシステムから取得したもので、ローカルテスト、コンパイル、シミュレーションに使用できる。 -
新しい方法
children()クラス用のScheduleクラスの新しいメソッドが追加されました。 このメソッドは、オブジェクトの子スケジュールコンポーネントをタプルとして返すために使用されます。Scheduleオブジェクトの子スケジュールコンポーネントをタプルとして返すために使用されます。 ネストされたスケジュールをフラット化せずに返す。 このメソッドは、プライベートな_children()メソッドと同等だが、パブリックで安定したインターフェースを持っている。 -
新しいオプティマイザ・クラス
GradientDescentクラスがqiskit.algorithms.optimizersモジュールに追加された。 このオプティマイザクラスは、次のような量子変分アルゴリズムで使用される標準的な勾配降下最適化アルゴリズムを実装しています。VQE. このクラスの詳しい説明と使用例についてはGradientDescentクラスのドキュメントを参照してください。 -
新しいオプティマイザ・クラス
QNSPSAクラスがqiskit.algorithms.optimizersモジュールに追加された。 このクラスは、2-SPSAアルゴリズムの一般化である量子自然SPSA(QN-SPSA) アルゴリズムを実装し、量子自然勾配の確率的推定を得るために、ヘシアンの代わりに量子フィッシャー情報行列を推定します。 この新しいオプティマイザの使い方の例についてはQNSPSAクラスのドキュメントを参照してください。 -
のコンストラクタに新しいクワーグ、
second_orderが追加された。SPSAクラスのコンストラクタにqiskit.algorithms.optimizersモジュールのクラスのコンストラクタに追加されました。Trueに設定すると、 2次SPSAが有効になる。 2次SPSA(2-SPSA)は、通常のSPSAアルゴリズムを拡張したもので、勾配と同時にヘシアンを推定することができ、パラメータ更新ステップの前に勾配の事前調整に使用される。 2次の方法として、これはSPSAの収束を改善しようとするものである。 このオプションの使用例についてはSPSAクラスのドキュメントを参照してください。 -
の
latexまたはlatex_source出力モードを使用する場合。circuit_drawer()またはdraw()のQuantumCircuitを使用する場合、mpl出力書式と同様にstylekwarg を使用することができます。 ただし、mpl出力モードとは異なり、latexまたはlatex_source出力モードを使用する場合は、displaytextフィールドのみが使用されます(どちらもカラーをサポートしていないため)。 -
mpl、またはlatex。circuit_drawer()関数またはdraw()のQuantumCircuitの出力メソッドを使う場合、stylekwargをユーザー生成の名前やラベルを持つdictとして設定することで、テキストに数学モードの書式を使ったり、色の書式を設定したりできるようになりました(mplのみ)。 例えば、添え字の追加やゲートの色の変更など:from qiskit import QuantumCircuit from qiskit.circuit.library import HGate qc = QuantumCircuit(3) qc.append(HGate(label='h1'), [0]) qc.append(HGate(label='h2'), [1]) qc.append(HGate(label='h3'), [2]) qc.draw('mpl', style={'displaytext': {'h1': 'H_1', 'h2': 'H_2', 'h3': 'H_3'}, 'displaycolor': {'h2': ('#EEDD00', '#FF0000')}}) -
新しいクラスを3つ追加、
CDKMRippleCarryAdderClassicalAdderDraperQFTAdderを追加した。qiskit.circuit.libraryモジュールに追加した。 これらの新しい回路クラスは、2つの等しい大きさの量子ビットレジスタの古典的な加算を実行するために使用される。 量子ビットの2つのレジスタ 、 、3つの新しいクラスが演算を行う:
例:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import CDKMRippleCarryAdder
from qiskit.quantum_info import Statevector
# a encodes |01> = 1
a = QuantumCircuit(2)
a.x(0)
# b encodes |10> = 2
b = QuantumCircuit(2)
b.x(1)
# adder on 2-bit numbers
adder = CDKMRippleCarryAdder(2)
# add the state preparations to the front of the circuit
adder.compose(a, [0, 1], inplace=True, front=True)
adder.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(adder)
counts = sv.probabilities_dict()
state = list(counts.keys())[0] # we only have a single state
# skip the input carry (first bit) and the register |a> (last two bits)
result = state[1:-2]
print(result) # '011' = 3 = 1 + 2- 新しいクラスを2つ追加、
RGQFTMultiplierとHRSCumulativeMultiplierを追加した。qiskit.circuit.libraryモジュールを追加した。 これらのクラスは、2つの等しいサイズの量子ビットレジスタの古典的な乗算を実行するために使用される。 クビット上の2つのレジスタ と に対して、2つの新しいクラスは次の操作を実行する
例:
from qiskit.circuit import QuantumCircuit
from qiskit.circuit.library import RGQFTMultiplier
from qiskit.quantum_info import Statevector
num_state_qubits = 2
# a encodes |11> = 3
a = QuantumCircuit(num_state_qubits)
a.x(range(num_state_qubits))
# b encodes |11> = 3
b = QuantumCircuit(num_state_qubits)
b.x(range(num_state_qubits))
# multiplier on 2-bit numbers
multiplier = RGQFTMultiplier(num_state_qubits)
# add the state preparations to the front of the circuit
multiplier.compose(a, [0, 1], inplace=True, front=True)
multiplier.compose(b, [2, 3], inplace=True, front=True)
# simulate and get the state of all qubits
sv = Statevector(multiplier)
counts = sv.probabilities_dict(decimals=10)
state = list(counts.keys())[0] # we only have a single state
# skip both input registers
result = state[:-2*num_state_qubits]
print(result) # '1001' = 9 = 3 * 3-
この
DelayクラスはParameterExpressionまたはParameterduration値が使えるようになりました。duration属性に例:
idle_dur = Parameter('t') qc = QuantumCircuit(1, 1) qc.x(0) qc.delay(idle_dur, 0, 'us') qc.measure(0, 0) print(qc) # parameterized delay in us (micro seconds) # assign before transpilation assigned = qc.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in us transpiled = transpile(assigned, some_backend_with_dt) print(transpiled) # delay in dt # assign after transpilation transpiled = transpile(qc, some_backend_with_dt) print(transpiled) # parameterized delay in dt assigned = transpiled.assign_parameters({idle_dur: 0.1}) print(assigned) # delay in dt -
新しいバイナリー・シリアライズ・フォーマット、QPYが導入された。 これは、Qiskitにネイティブな後方互換性のある(Qiskitの古いバージョンで生成されたQPYファイルをQiskitの新しいバージョンで読み込むことができる)高速バイナリシリアライゼーションフォーマットとして設計されています。 QPYシリアライゼーション・ツールは
qiskit.circuit.qpy_serialization。 例えば、QPYファイルを生成する場合:from datetime import datetime from qiskit.circuit import QuantumCircuit from qiskit.circuit import qpy_serialization qc = QuantumCircuit( 2, metadata={'created_at': datetime.utcnow().isoformat()} ) qc.h(0) qc.cx(0, 1) qc.measure_all() circuits = [qc] * 5 with open('five_bells.qpy', 'wb') as qpy_file: qpy_serialization.dump(circuits, qpy_file)そして、QPYファイルに保存された5つの回路をロードすることができる:
from qiskit.circuit.qpy_serialization with open('five_bells.qpy', 'rb') as qpy_file: circuits = qpy_serialization.load(qpy_file)QPYファイル・フォーマットの仕様は、モジュールのドキュメントに掲載されている。
-
この
TwoQubitBasisDecomposerクラスは、CX、√X、仮想Rzゲートを持つ基底に対してパルス最適分解を行うように更新された。 https://arxiv.org/pdf/2008.08571. ここでいうパルス最適化とは、分解されたCXゲート間のゲートの持続時間が短縮される代わりに、すべてのCXゲートの前または後に、より多くのローカルゲートが配置される可能性があり、回路に構成されたときに、隣接するゲートによって全体のシーケンス持続時間が短縮される単一量子ビット圧縮の可能性があることを意味する。のコンストラクタに新しいキーワード引数
`pulse_optimizeが追加された。TwoQubitBasisDecomposerのコンストラクタに追加された:None:パルス最適分解を試みる。 パルス最適分解が分解者の基底に対して未知の場合、警告なしに標準分解に戻る。 これはデフォルトの設定です。True:パルス最適分解を試みる。 パルス最適分解が分解者の基底に対して未知の場合、 QiskitError を上げる。False:パルス最適分解を試みてはならない。
例:
from qiskit.quantum_info import TwoQubitBasisDecomposer from qiskit.circuit.library import CXGate from qiskit.quantum_info import random_unitary unitary_matrix = random_unitary(4) decomposer = TwoQubitBasisDecomposer(CXGate(), euler_basis="ZSX", pulse_optimize=True) circuit = decomposer(unitary_matrix) -
にあるトランスパイラー・パス
UnitarySynthesisが更新されました。qiskit.transpiler.passesが更新され、パルス最適分解の実行がサポートされました。 これは主に、コンストラクタに追加されたキーワード引数pulse_optimize、パルス最適合成を実行するかどうかを制御するために使われる。 このkwargの動作は、クラスのコンストラクタのpulse_optimizekwargを反映している。TwoQubitBasisDecomposerクラスのコンストラクタの さらに、コンストラクタにはもう1つの新しいキーワード引数、synth_gatesがあり、合成を試みるゲート名のリストを指定するのに使われる。Noneとpulse_optimizeがFalseまたはNoneの場合は、"unitary"を使用する。 None で pulse_optimize がTrueの場合、"unitary"と"swap"を使用する。 合成におけるCXゲートの方向は任意であるため、もう1つのキーワード引数natural_direction、最初にカップリング・マップを考慮し、次にデュレーションを考慮する。CXGateデュレーションを考慮します。from qiskit.circuit import QuantumCircuit from qiskit.transpiler import PassManager, CouplingMap from qiskit.transpiler.passes import TrivialLayout, UnitarySynthesis from qiskit.test.mock import FakeVigo from qiskit.quantum_info.random import random_unitary backend = FakeVigo() conf = backend.configuration() coupling_map = CouplingMap(conf.coupling_map) triv_layout_pass = TrivialLayout(coupling_map) circ = QuantumCircuit(2) circ.unitary(random_unitary(4), [0, 1]) unisynth_pass = UnitarySynthesis( basis_gates=conf.basis_gates, coupling_map=None, backend_props=backend.properties(), pulse_optimize=True, natural_direction=True, synth_gates=['unitary']) pm = PassManager([triv_layout_pass, unisynth_pass]) optimal_circ = pm.run(circ) -
basisの引数に新しい基本オプション'XZX'が追加された。OneQubitEulerDecomposerクラスに追加された。 -
新しいメソッドを追加しました、
get_instructions()が追加された。QuantumCircuitクラスに追加されました。 このメソッドはInstructionオブジェクトを返します。namenameqargscargsを持つすべてのオブジェクトを返します。QubitとClbitオブジェクトを返します。 -
qiskit-terraパッケージに新しいオプション追加
all。 これにより、例えば、1つのエクストラですべてのオプション要件をインストールすることができます:pip install 'qiskit-terra[all]'以前は、すべてのオプションの依存関係を同時にインストールするために、すべてのエクストラを個別にリストする必要がありました。 -
新しいクラスを2つ追加
ProbDistributionとQuasiDistributionクラスが追加された。 これらのオブジェクトはどちらも辞書のサブクラスで、確率分布と準確率分布を扱うためのメソッドが追加されています。 -
新しい
settingsプロパティを追加した。Optimizer抽象ベース・クラスに新しいプロパティを追加した。qiskit.algorithms.optimizersに新しいプロパティを追加しました。 このプロパティは、同じオプティマイザ・クラスの別のインスタンスをインスタンス化するために使用できる、オプティマイザの設定の Python 辞書を返します。 例:from qiskit.algorithms.optimizers import GradientDescent optimizer = GradientDescent(maxiter=10, learning_rate=0.01) settings = optimizer.settings new_optimizer = GradientDescent(**settings)settingsディクショナリは、JSON や他のシリアライズ形式を使用してオプティマイザー・オブジェクトをシリアライズする際にも役立つ可能性があります。 -
qiskit.user_configモジュールに新関数set_config()が追加された。 QiskitのAPIからユーザーコンフィグに値を設定する機能。 例:from qiskit.user_config import set_config set_config("circuit_drawer", "mpl", section="default", file="settings.conf")その結果、
settings.confファイルのdefaultセクションにcircuit_drawer = mplの値が追加される。引数
file_pathが指定されない場合、現在使用されているユーザー設定ファイルへのパス(設定されていれば環境変数QISKIT_SETTINGSの値、またはデフォルトの場所~/.qiskit/settings.conf)が更新される。 しかし、既存のコンフィグファイルへの変更は、インポート時にコンフィグファイルが解析されるため、現在のセッションには反映されない。 -
新しいステート・クラスを追加、
StabilizerStateを追加した。qiskit.quantum_infoモジュールを追加しました。 このクラスは、 Aaronson and Gottesman (2004 )の慣例を用いて、スタビライザー・シミュレーターの状態を表します。 -
関数の
sortkwargに'value'と'value_desc'の2つの新しいオプションが追加された。qiskit.visualization.plot_histogram()関数に追加された。sortがこれらのオプションのいずれかに設定されている場合、出力の可視化は、各ビット文字列の最大確率に基づいてX軸を並べ替えます。 例:from qiskit.visualization import plot_histogram counts = { '000': 5, '001': 25, '010': 125, '011': 625, '100': 3125, '101': 15625, '110': 78125, '111': 390625, } plot_histogram(counts, sort='value')
既知の問題
- 実行時
parallel_map()(および内部的にparallel_map()やtranspile()およびassemble()などを内部的に呼び出す関数)を実行すると、QISKIT_PARALLELが True に設定された Python 3.9 上でプログラムがデッドロックに陥り、実行が終了しないことがあります。 このような事態を避けるため、 Python 3.9 のデフォルトは並列実行しないように変更されたが、QISKIT_PARALLELが明示的に有効化されている場合は、まだこのような事態が発生する可能性がある。
アップグレードの注意
-
retworkxの依存関係の最小バージョンは、バージョン 0.9.0 に増加した。 これは、このリリースで導入された新しいAPIを使用するために行われたもので、トランスパイラ・パスのパフォーマンスが向上している。
-
Python 3.9 環境での
QISKIT_PARALLELのデフォルト値がFalseに変更された。これは、 Python 3.9 で実行する場合、デフォルトではマルチプロセッシングが使用されないことを意味する。 これは、 Python 3.9 (詳細は既知の問題セクションを参照)上でマルチプロセッシングを実行する際に発生する可能性のあるデッドロック/ハングアップの問題を回避するために行われた。 環境変数QISKIT_PARALLELを明示的にTRUEに設定することで、手動で有効にすることも可能です。 -
qiskit.test.mockの既存の偽のバックエンド・クラスは、現在では厳密にBackendV1インターフェイスを実装するようになりました。 つまり、手動でQasmQobjまたはPulseQobjオブジェクトを手動で構築していた場合、run()メソッドで使用することはできません。run()メソッドはQuantumCircuitまたはScheduleオブジェクトしか受け付けない。 これは、qobjなしで実装された新しいバックエンドのテストを可能にするために必要でした。 偽のバックエンドを活用する必要がある場合はQasmQobjまたはPulseQobj新しい偽のレガシー・バックエンド・オブジェクトが追加され、レガシー・プロバイダー・インターフェースを明示的にテストできるようになりました。 これは、レガシーインターフェースが非推奨となり削除された後に削除される。 今後、新しい偽のバックエンドはBackendV1インターフェイスのみを実装し、新しい偽のバックエンドのために新しいレガシーバックエンドクラスを追加することはありません。 -
無効な文字列ラベルを持つ
Pauliオブジェクトを無効な文字列ラベルで作成するとQiskitErrorが発生するようになった。 これは、無効な文字列ラベルに対してAttributeErrorを発生させていた以前のリリースからの変更である。 この変更は、エラーメッセージをより分かりやすく、一般的なAttributeErrorと区別できるようにするために行われた。 -
パルスビルダー(
qiskit.pulse.builder.build())からの出力プログラムの表現がScheduleからScheduleBlock. この新しい表現は、シフトやインサートなど、タイミングに関連するいくつかの操作を無効にする。 しかし、これによってビルダー・コンテキスト内で命令時間をパラメータ化することができる。 例:from qiskit import pulse from qiskit.circuit import Parameter dur = Parameter('duration') with pulse.build() as sched: with pulse.align_sequential(): pulse.delay(dur, pulse.DriveChannel(1)) pulse.play(pulse.Gaussian(dur, 0.1, dur/4), pulse.DriveChannel(0)) assigned0 = sched.assign_parameters({dur: 100}) assigned1 = sched.assign_parameters({dur: 200})持続時間を割り当てたスケジュールを直接アセンブラ(またはバックエンド)に渡すこともできるし、パルスゲートとして量子回路に取り付けることもできる。
-
これまでオプショナルな依存関係であった tweedledum ライブラリが必須となった。 が広く使われているためである。
PhaseOracle(これはtweedledumがインストールされているかどうかに依存する)のアルゴリズムが広く使われているためである。qiskit.algorithms. -
以前は
pip install qiskit-terra[full-featured-simulators]のようなものでqiskit-aerをインストールするために使用できたオプションの追加full-featured-simulatorsはqiskit-terraパッケージから削除されました。 もしこれがqiskit-terraの代わりにqiskit-aerをインストールするために使用されているのであれば、 qiskit メタパッケージに依存するか、qiskit-terra と qiskit-aer をpip install qiskit-terra qiskit-aerと一緒にインストールする必要があります。 -
Linux ( x86_64, aarch64, ppc64le ) および macOS ユーザー ( x86_64 および arm64 ) 向けに、新しい要件 symengine が追加されました。 Windows(および 64bit Windows用のプリコンパイルパッケージとして PyPi で入手可能)やその他のアーキテクチャでは、オプションで依存する。 このシステムを導入することで、次のような評価のパフォーマンスが大幅に向上する。
ParameterおよびParameterExpressionオブジェクトの評価のパフォーマンスが大幅に向上します。 -
すべてのライブラリ回路クラス、すなわち
QuantumCircuitの派生クラスはすべてqiskit.circuit.libraryでラップされる。Instruction(でラップされる(あるいはGateでラップされるようになった。) 例えばQFT回路を以前は
┌───┐ q_0: ────────────────────■────────■───────┤ H ├─X─ ┌───┐ │ │P(π/2) └───┘ │ q_1: ──────■───────┤ H ├─┼────────■─────────────┼─ ┌───┐ │P(π/2) └───┘ │P(π/4) │ q_2: ┤ H ├─■─────────────■──────────────────────X─ └───┘そして今は次のように見える
┌──────┐ q_0: ┤0 ├ │ │ q_1: ┤1 QFT ├ │ │ q_2: ┤2 ├ └──────┘古い回路を取得するには、回路上の
decompose()メソッドを呼び出すこの変更は主に一貫性を保つために行われました。
qiskit.circuit.libraryの一部の回路クラスがInstructionまたはGateでラップされていましたが、すべてではありませんでした。
非推奨のメモ
qiskit.exceptions.QiskitIndexErrorクラスは非推奨であり、将来のリリースで削除される予定です。 この例外はQiskitの何かで積極的に使用されているわけではありません。もし使用していたのであれば、カスタム例外クラスを作成して置き換えることができます。- のkwargs
epsilon、factr。qiskit.algorithms.optimizers.L_BFGS_Bのkwargfactrと は非推奨です。P_BFGSは非推奨であり、将来のリリースで削除される予定です。epsilonの代わりにepskarg をお使いください。factrkwarg はftolに置き換えられる。 両者の関係はftol = factr * numpy.finfo(float).eps。 この変更は、scipy.optimize.minimize関数'L-BFGS-B'メソッドの使用方法との一貫性を保つために行われた。 これらの新しいパラメーターの使用方法については、:scipy.optimize.minimize(method='L-BFGS-B')のドキュメントを参照。 qiskit.providers.BaseBackend、qiskit.providers.BaseJob、qiskit.providers.BaseProviderの抽象クラスで構成されていたレガシー・プロバイダー・インターフェイスは非推奨となり、将来のリリースで削除される予定である。 代わりに、バージョン管理されたインターフェイスを使用する必要があります。qiskit.providers.BackendV1,qiskit.providers.JobV1そしてqiskit.providers.ProviderV1. V1 オブジェクトは、レガシー・インターフェイスからバージョンアップされたものへの移行を容易にするため、ほとんどが後方互換性を持っている。 しかし、抽象的なインターフェースの将来のバージョンでは、もっと分岐が多くなることが予想される。 バージョン管理されたインターフェイスの詳細についてはqiskit.providersバージョン管理されたインターフェイスの詳細については、ドキュメントを参照してください。condition。DAGDepNodeの対応するcondition属性とともに、コンストラクタへの kwarg は非推奨となり、将来のリリースでは削除される予定です。DAGDepNodeは非推奨となり、将来のリリースで削除される予定です。 代わりに、ノードがop型の場合、DAGDepNode.op.conditionを使ってDAGDepNodeのconditionにアクセスすることができる。- クラスの
condition。DAGNodeクラスの属性は非推奨となり、将来のリリースで削除される予定です。 代わりに、ノードがop型であれば、DAGNode.op.conditionを使ってDAGNodeオブジェクトのconditionにアクセスすることができます。 - パルスビルダー(
qiskit.pulse.builder.build()) 構文qiskit.pulse.builder.inline()は非推奨であり、将来のリリースで削除される予定である。 このコンテキストを使う代わりに、インライン・コンテキスト内のアライメント・コンテキストを削除することができる。 - パルスビルダー(
qiskit.pulse.builder.build()) 構文qiskit.pulse.builder.pad()は非推奨であり、将来のリリースで削除される予定である。 これはScheduleBlockこれは、パルスビルダーが返す.insertメソッドがサポートされていない(ビルダーには挿入構文がない)ためです。 他の命令の挿入をブロックするためのタイムスロット・プレースホルダの使用は、もはや必要ない。
バグ修正
-
その
OneQubitEulerDecomposerとTwoQubitBasisDecomposerクラスが改良され、公差の厳格化、再現性の向上、単純化、およびグローバル位相追跡のバグが修正されました。 -
属性の割り当てに関する問題を修正しました。
name属性のGateinverse`()の割り当てに関する問題を修正しました。 この修正以前は、inverse`()が呼び出されると、inverse が呼び出されるたびに無条件に_dgが追加されていた。 この問題は修正され、inverse`()を2回呼び出すと、_dgの接尾辞が削除されるようになった。 -
のトリビアル・チェック条件を固定する。
CZGate,CRZGate,CU1GateおよびMCU1GateHoareOptimizerの些細なチェック条件を修正した。 以前は、場合によってはオプティマイザがこれらのゲートを削除し、変換の意味的等価性を壊していた。 -
のオブジェクトを
ListOpオブジェクトのPauliSumOpオブジェクトをPauliExpectationまたはAerPauliExpectation. 以前は、パウリ表現に変換すると警告が出ましたが、これは高くつく可能性があります。 を内部的にListOpをSummedOpオブジェクトのPauliOpオブジェクトに変換する代わりにPauliSumOpを生成するようになった。 修正 #6159 -
の
NLocalクラスの問題を修正しました。qiskit.circuit.libraryモジュールのクラスの問題を修正しました。repskwarg に無効な型が使われた場合、オブジェクトの初期化時に正しく例外が発生せず、後で予期しない実行時エラーになることがありました。repskwargがintの値でない場合、TypeErrorが適切に発生するようになった。 6515を修正 -
の
TwoLocalクラスがqiskit.circuit.libraryモジュールのクラスが、entanglementkwargの有効な入力としてnumpy整数型(例:numpy.int32,numpy.int64, etc)を受け付けなかった問題を修正した。 修正 #6455 -
クラスの
from_qasm_file()またはfrom_qasm_str()コンストラクタで OpenQASM2 ファイルまたは文字列をロードするとき。QuantumCircuitクラス用のコンストラクタでdelayまたは ファイルまたは文字列をロードするとき、 OpenQASM2 回路に という名前の命令がある場合、この命令は クラス用のコンストラクタにマップされます。qiskit.circuit.Delay命令にマップされます。 例:from qiskit import QuantumCircuit qasm = """OPENQASM 2.0; include "qelib1.inc"; opaque delay(time) q; qreg q[1]; delay(172) q[0]; u3(0.1,0.2,0.3) q[0]; """ circuit = QuantumCircuit.from_qasm_str(qasm) circuit.draw()6510を修正
-
オブジェクト間の追加に関する問題を修正しました。
PauliSumOp係数を持つParameterExpression係数を持つオブジェクト間の加算に関する問題を修正した。 以前はこの場合、QiskitError例外が発生した。ParameterExpressionが正しく処理されなかったため、例外が発生した。 を持つオブジェクト間で足し算ができるように修正されました。PauliSumOp係数を持つParameterExpression係数を持つオブジェクト間で加算が実行できるように修正されました。 -
クラスの初期化に関する問題を修正。
AmplificationProblemクラスの初期化に関する問題を修正しました。is_good_statekwargは必須項目であったが、誤って任意項目として扱われていた(そのように文書化されていた)。 これは修正され、入力oracleがPhaseOracleオブジェクト(これは評価メソッドを提供する)でない限り、フィールドは必須であり、is_good_stateなしで構築された場合はTypeErrorが発生する。 -
にコントロールを追加すると、内部で開いているコントロールが解除される問題を修正しました。
ControlledGateにコントロールを追加すると、内部のオープンコントロールがアンセットされる問題を修正しました。 5857を修正 -
の
convert()クラスのPauliExpectationクラスのメソッドで、エルミートでない演算子に対してこのメソッドを呼び出すと正しくない結果が返される問題を修正しました。 修正 #6307 -
の問題を修正しました。
qiskit.pulse.transforms.inline_subroutines()関数の問題を修正しました。 修正 #6321 -
Python 標準ライブラリーの
functools.partial()関数で作成された部分的にバインドされた callable をschedulekwarg としてadd()メソッドに渡す際の問題を修正しました。InstructionScheduleMapクラスのメソッドに渡すとエラーになる問題を修正した。 6278を修正 -
の問題を修正しました。
PiecewiseChebyshevの問題を修正しました。breakpointsをNoneに設定すると、既存のオブジェクトが誤ってブレークポイントとして扱われる問題を修正しました。 これを修正し、Noneに設定すると、全区間で近似するデフォルトの動作に戻るようにした。 6198を修正 -
の問題を修正しました。
num_connected_components()メソッドの問題を修正しました。QuantumCircuitこのメソッドは、回路が古典レジスタを条件とする2つ以上のゲートを含む場合に、不正なコンポーネント数を返していました。 6477を修正 -
モジュールの問題を修正しました。
qiskit.opflow.expectationsモジュールの問題を修正しました。 を使用した場合のグラデーションとQFIの計算も修正されました。PauliExpectationまたはAerPauliExpectationクラスを使用した場合の 例えば、以前は:from qiskit.opflow import StateFn, I, One exp = ~StateFn(I) @ (2 * One)については
2、その他の期待値変換器については。AerPauliExpectationその他の期待値変換器については4に評価される。~StateFn(I) @ (2 * One)は~(2 * One) @ I @ (2 * One)の省略記法であるため、すべての期待値変換器に対して4の正しい係数が返される。 修正 #6497 -
PauliOpがフェイズを持つときにto_circuit()が失敗するバグを修正。 同時に、PauliGateの使用効率も高まった。 -
メソッドによって生成されたQASM出力が、QASMの
qasm()メソッドによって生成されるQuantumCircuitのような複合ゲートに対してMCXGateおよびその変種(MCXGrayCode,MCXRecursiveおよびMCXVChain) は正しくない。 回路内のGateqelib1.incに存在しない場合、その定義は出力QASM文字列に追加される。 #4943と #3945を修正 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドのQuantumCircuit.mplまたはlatex出力モードを使用する場合、cregbundlekwarg をFalseに設定し、reverse_bitskwarg をTrueに設定すると、reverse_bitsをFalseに設定したときと同じ順序で古典レジスタのビットが表示される。 -
qiskit.extensions.Initialize命令を使用した場合に、合成された定義のグローバル位相が正しく設定されない問題を修正しました。 5320を修正 -
のビット順序が測定されたビット列の順序と一致していなかった問題を修正。
qiskit.circuit.library.PhaseOracle.evaluate_bitstring()のビット順序が測定されたビット列の順序と一致していなかった問題を修正した。 この修正はGroverアルゴリズム・クラスの実行にも影響します。PhaseOracleとして指定された場合のアルゴリズム・クラスの実行にも影響します。 修正 #6314 -
のバグを修正した。
Optimize1qGatesDecomposition()のバグを修正した。 -
qiskit.opflow.gradients.Gradient.gradient_wrapper()メソッドにおける勾配計算の問題を修正。 以前は、演算子が対角でない場合、状況によっては正しくない結果が返されていた。 これは、結果が常に正しいことを保証するために期待値コンバーターを使用することで修正された。 -
の問題を修正しました。
circuit_drawer()関数とdraw()メソッドの問題を修正しました。QuantumCircuitの関数とメソッドで、古典ビットを含むカスタム命令が正しくレンダリングされない場合がある問題を修正しました。 3201 、#3202 、#6178を修正 -
の問題を修正した。
circuit_drawer()とdraw()メソッドの問題を修正しました。QuantumCircuitクラスの問題を修正しました。mpl出力モードを使用すると、制御された Z ゲートが誤って非対称に描画されました。 5981を修正 -
OptimizeSwapBeforeMeasureトランスパイラー・パスの問題を修正。SwapGateが削除されてしまう問題を修正した。 修正 #6192 -
クラスのフェーズに関する問題を修正しました。
qiskit.opflow.gradients.QFIクラスのフェーズに関する問題を修正しました。qfi_methodがlin_comb_fullに設定されている場合、不正な observable が評価される原因となっていました。 -
での問題を修正しました。
VQEアルゴリズム・クラスをL_BFGS_BまたはP_BFGSオプティマイザクラスで勾配を使用する場合、勾配が期待される浮動小数点数のリストではなく、numpyの配列として誤って渡され、エラーになる問題を修正しました。 でグラデーションを使用できるようになりました。VQEとL_BFGS_BまたはP_BFGSオプティマイザで使用できるようになりました。
その他の注意事項
Instructionクラスのparameters()メソッドの非推奨が取り消された。 この方法は元々、 0.17.0 で非推奨とされていたものだが、校正実験を行う場合など、いくつかの用途では今でも必要である。 この方法は今後もサポートされ、削除されることはない。
エア 0.8.2
変更なし
イグニス 0.6.0
変更なし
アクア 0.9.4
変更なし
IBM Q プロバイダー 0.15.0
新機能
-
ジョブが失敗した場合にその理由を表す文字列を返す新しいメソッド
qiskit.providers.ibmq.runtime.RuntimeJob.error_message()のサポートを追加。 -
qiskit.providers.ibmq.runtime.IBMRuntimeService.run()メソッドの inputs パラメータに、オートコンプリート機能をサポートするqiskit.providers.ibmq.runtime.ParameterNamespaceインスタンスを指定できるようになりました。ParameterNamespaceのインスタンスを取得するにはqiskit.providers.ibmq.runtime.RuntimeProgram.parameters()を使う。例:
from qiskit import IBMQ provider = IBMQ.load_account() # Set the "sample-program" program parameters. params = provider.runtime.program(program_id="sample-program").parameters() params.iterations = 2 # Configure backend options options = {'backend_name': 'ibmq_qasm_simulator'} # Execute the circuit using the "circuit-runner" program. job = provider.runtime.run(program_id="sample-program", options=options, inputs=params) -
qiskit.providers.ibmq.runtime.IBMRuntimeService.set_program_visibility()を使って、 Qiskit Runtime プログラムの可視性(プライベート/パブリック)を設定できるようになった。 -
qiskit.providers.ibmq.runtime.IBMRuntimeService.jobs()にオプションのブール値パラメータ pending が追加され、ジョブをステータスでフィルタリングできるようになりました。 pendingが指定されていない場合は、すべてのジョブが返される。 pending が True に設定されている場合、'QUEUED' および 'RUNNING' ジョブが返される。 pendingをFalseに設定すると、'DONE'、'ERROR'、'CANCELLED'のジョブが返される。 -
qiskit.providers.ibmq.IBMQBackend.run()メソッドにuse_measure_espフラグのサポートを追加。Trueの場合、バックエンドはその量子ビットの終端命令である全ての測定にESP読み出しを使用する。 バックエンドが ESP 読み出しをサポートしていない場合に使用すると、エラーが発生します。
アップグレードの注意
qiskit.providers.ibmq.runtime.RuntimeProgram.parameters()は、qiskit.providers.ibmq.runtime.ParameterNamespaceインスタンスを返すメソッドになりました。このインスタンスを使って、実行時プログラムのパラメータ値を入力し、qiskit.providers.ibmq.runtime.IBMRuntimeService.run()に渡すことができます。- バックエンド設定の
open_pulseフラグは、バックエンドがパルスレベル制御をサポートしているかどうかを示さなくなった。 その結果、qiskit.providers.ibmq.IBMQBackend.configuration()はPulseBackendConfigurationopen_pulseFalseインスタンスを返すかもしれない。 - ジョブシェアレベルは普及率が低いためサポートされなくなり、対応するインターフェースは将来のリリースで削除される予定です。 つまり、ジョブの作成時にshare_levelを渡したり、ジョブの共有レベルを取得するために
qiskit.providers.ibmq.job.IBMQJob.share_level()。
非推奨のメモ
- IBM ハードウェアバックエンドでは、
id命令は廃止された。 代わりに、dt単位で指定される可変長遅延を実装するdelay命令を使用してください。id命令を含む回路を実行する場合、ジョブ送信時に警告が発せられ、ジョブ内のid命令は自動的に同等のdelay命令に置き換えられます。