PauliLindbladMap
class qiskit.quantum_info.PauliLindbladMap(data, /, num_qubits=None)
ベース: object
量子ビット・スパース形式で保存されたパウリ・リンドブラッド写像。
数学
パウリ・リンドブラッド写像は、 -qubits上の密度行列に作用する線形写像である:
ここで、 は の 1 量子ビット・パウリ演算子の部分集合であり、率(または係数) は実数である。 のすべての係数が非負である場合、これは完全正かつトレース保存写像に対応する。 指数関数内の和は「生成元」と呼ばれ、個々の項は「生成項」と呼ばれる。 このドキュメントの残りの部分で表記を簡略化するため、 と表記する。
準確率表現
マップ は積として書くことができる:
それぞれの 、次のようになる
ここで 。もし ならば であり、この項は完全に正でトレース保存の写像であることに注意。 しかし、 、 、写像は完全な正則保存でもトレース保存でもない。 、 、 を、 の場合は 、 の場合は とすると、マップは次のように書き換えられる:
, の場合、式は同一性写像と による共役の標準混合に帰着する。 , , の場合、写像は、 による恒等写像と共役の、確率の重みを持つ(したがって "準確率 "である)スケーリングされた差である。 これは文献とは若干異なる表現であるが、この表記法によって、非負レートと負レートの両方を同時に扱うことができることに注意されたい。 チャンネル全体の は、積 。
を参照のこと。 PauliLindbladMap.sample() メソッドを参照。
表現
ジェネレーターの個々のパウリ演算子は、 、 の形の1量子ビットのパウリ演算子のテンソル積である。の内部表現は PauliLindbladMap の内部表現は、非同一の単一量子ビットパウリ演算子のみを格納する。 これにより、 のようなジェネレーターを表現する際の効率が大幅に向上する。 PauliLindbladMap は総クビット数に線形な量のメモリを必要とする。
内部的には、率の配列と、対応する疎な PauliLindbladMap パウリ演算子を含む QubitSparsePauliList を格納する。 さらに、メソッド gamma() を用いて全体的なチャネル PauliLindbladMap を計算できるほか、メソッド probabilities() を介して対応する確率 も計算できる。
索引付け
PauliLindbladMap は、 Python シーケンス (展開された collections.abc.Sequence). マップのジェネレーターは、整数でインデックスを付け、反復して個々のジェネレーター項を得ることができる。
各ジェネレーター用語は、自己完結型のクラスのインスタンスとして表示される。 個々の用語はベースマップからコピーされるため、用語に変異が加わっても、インデックスが作成された元のマップには影響しない。
GeneratorTerm
class GeneratorTerm(rate, qubit_sparse_pauli)
ベース: object
完全な PauliLindbladMap.
これらは一般的に PauliLindbladMap.
copy
copy()
今期のコピーを入手する
indices
各非同一シングル量子ビットの項のインデックスに関する読み取り専用ビュー。
インデックスは常にソート順となる。
num_qubits
その項が定義されている量子ビットの数。
pauli_labels
pauli_labels()
用語の pauli ラベルを文字列として返す。
の順序と一致する。 GeneratorTerm.indices文字列のi番目の文字が term.indices[i] の量子ビットインデックスに適用される。 E.g. 演算子 X が量子ビット0に作用し、 Y が量子ビット 3 に作用する項は、 term.indices == np.array([0, 3]) と term.pauli_labels == "XY" を持つ。
戻り値
非同一性ビット項を連結した文字列。
paulis
個々の単一量子ビット項に関する読み取り専用ビュー。
配列の中で有効な値は、対応する Pauli を持つものだけである。
qubit_sparse_pauli
この用語はqubit_sparse_pauli。
rate
期間レート。
to_pauli_lindblad_map
to_pauli_lindblad_map()
この用語を完全に変換する PauliLindbladMap.
建設
PauliLindbladMap はいくつかのコンストラクタを定義している。 デフォルトのコンストラクタは、入力の型に基づいて、より特殊なコンストラクタのいずれかに委譲しようとする。 特定のコンストラクタを使用することで、よりコントロールしやすくなる。
メソッド | サマリー |
|---|---|
from_list() | ジェネレーターは、密な文字列ラベルと関連するレートのタプルのリストとして与えられる。 |
from_sparse_list() | 疎な文字列ラベルのタプルのリストとして与えられたジェネレータ、それらが適用される量子ビット、およびそれらのレート。 |
from_terms() | 明示的な単一インスタンスの合計 GeneratorTerm インスタンスになります。 |
from_components() | レートの配列と QubitSparsePauliList インスタンスから構築する。 |
__new__
__new__(data, /, num_qubits=None)
のデフォルトコンストラクタは PauliLindbladMap.
これは、 data の引数の型に基づいて、 明示的な変換コンストラクタ・メソッドのいずれかに委譲する。 num_qubits が与えられ、 data の型が暗示するコンストラクタが数値を受け付けない場合、与えられた整数は入力と一致しなければならない。
パラメーター
- data - 入力のデータ型。 これは別の
PauliLindbladMapこの場合、入力はコピーされます。from_list()またはfrom_sparse_list(). - num_qubits (int|None) – マップの量子ビット数(オプション)。 ほとんどのデータ入力では、これは推測できるので、渡す必要はない。 これは空リストかスパース・リスト形式でのみ必要である。 不必要に与えられる場合は、入力されたデータと一致しなければならない。
変換ベースのコンストラクターに加えて、特殊な形式のマップを作成するヘルパー・メソッドもある。
メソッド | サマリー |
|---|---|
identity() | 与えられた数の量子ビットにおける同一性マップ。 |
変換
既存の PauliLindbladMap を他のフォーマットに変換することができる。
メソッド | サマリー |
|---|---|
to_sparse_list() | マップを、要素 (paulis, indices, rate) を持つスパースリスト形式で表現する。 |
属性
num_qubits
マップが作用する量子ビットの数。
アイデンティティは明示的に保存されないため、これは他の形状や値からは推測できない。
num_terms
このマップの指数に含まれる生成項の数。
rates
地図の料金
方法
apply_layout
apply_layout(layout, num_qubits=None)
このパウリ・リンドブラッド地図にトランスパイラ・レイアウトを適用する。
これにより、例えばマップが仮想量子ビットラベルで定義されている場合、量子ビットインデックスの再マッピングが可能になる。
パラメーター
- layout (TranspileLayout |list[int] | None) – レイアウトを適用する。 この関数のほとんどの用途は、ハードウェア用にトランスパイルされた回路から
QuantumCircuit.layoutフィールドを渡すべきである。 さらに、新しい量子ビット・インデックスのリストを渡すこともできる。 明示的にNoneを指定すると、リマッピングは適用されない(ただし、num_qubitsを使ってマップを拡張することはできる)。 - num_qubits (int | None) – マップを拡張する量子ビットの数。 もし与えなければ、出力は与えられた
TranspileLayoutと同じ幅になる。layoutが別の形式で与えられている場合は、入力と同じ幅になる。
戻り値
新しい PauliLindbladMap を作成し、提供されたレイアウトを適用します。
clear
clear()
この写像からすべての生成項を消去し、再び同一写像に等しくする。
これにより内部の割り当て容量は変更されないため、合成によって生じるその後の加算や減算の操作では、再割り当てが必要ない場合があります。
例
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IXXXYY", 2.0), ("ZZYZII", -1)])
>>> pauli_lindblad_map.clear()
>>> assert pauli_lindblad_map == PauliLindbladMap.identity(pauli_lindblad_map.py_num_qubits())compose
compose(other)
別の人と作曲する PauliLindbladMap.
これにより、selfとotherの内部配列が追加され、selfの項に続いてotherの項が列挙されたマップとなる。
パラメーター
other (PauliLindbladMap) – パウリ・リンドブラッドの地図を使って作曲する。
copy
copy()
このパウリ・リンドブラッドの地図を手に入れよう。
例
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IXZXYYZZ", 2.5), ("ZXIXYYZZ", 0.5)])
>>> assert pauli_lindblad_map == pauli_lindblad_map.copy()
>>> assert pauli_lindblad_map is not pauli_lindblad_map.copy()drop_paulis
drop_paulis(indices)
このパウリ・リンドブラッドの地図からパウリを外す。
指定されたインデックスのパウリをすべて削除し、事実上、アイデンティティに置き換える。
出来上がったマップには重複が含まれることがあるが、それは PauliLindbladMap.simplify() メソッドを使って取り除くことができる。
パラメーター
indices (Sequence[int]) – ポーリスを落とさなければならない指標。
戻り値
新しいパウリ・リンドブラッド地図は、指定されたインデックス上のすべてのパウリが取り除かれている。
例
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_paulis([1, 2, 4])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("IXIII", 2.0), ("IIIIZ", 0.5), ("IIIIY", -0.25)])drop_qubits
drop_qubits(indices)
このパウリ・リンドブラッド写像から量子ビットを取り出して、効果的にトレースアウト操作を行う。
出来上がったマップには重複が含まれることがあるが、それは PauliLindbladMap.simplify() メソッドを使って取り除くことができる。
パラメーター
indices (Sequence[int]) – トレースアウトする量子ビットのインデックス。
戻り値
新しいパウリ・リンドブラッド・マップは、与えられたインデックス上のすべてのパウリをトレースしたものである。
例
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.drop_qubits([1, 2, 4])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("XI", 2.0), ("IZ", 0.5), ("IY", -0.25)])from_components
static from_components(rates, qubit_sparse_pauli_list)
from_list
static from_list(iter, /, *, num_qubits=None)
密なジェネレーター・ラベルとレートのリストからパウリ・リンドブラッド写像を構築する。
これは SparsePauliOp.from_list(). この密なフォームでは、各ラベルにすべてのIDを明示的に与えなければならない。
ラベルはアルファベット 'IXYZ' の並びでなければならない。 ラベルはビット列と同様に解釈される。 つまり、一番右の文字が0番量子ビットに対応し、以下同様である。 のラベルと同じである。 Pauli と SparsePauliOp.
パラメーター
- iter (list[tuple[str, float]]) – ジェネレーターサムにおけるラベルとそのレートのペア。
- num_qubits (int | None) – ラベルの長さから推測できるので、
iterが空の配列でないことが確かならば、これを指定する必要はない。iterが空である可能性がある場合、マップがいくつの量子ビットに作用するかを曖昧にするためにこの引数を指定しなければならない。 これが与えられ、iterが空でない場合、値はラベルの長さと一致しなければならない。
例
ラベルのリストからパウリ・リンドブラッド地図を作る:
>>> PauliLindbladMap.from_list([
... ("IIIXX", 1.0),
... ("IIYYI", 1.0),
... ("IXXII", -0.5),
... ("ZZIII", -0.25),
... ])
<PauliLindbladMap with 4 terms on 5 qubits:
(1)L(X_1 X_0) + (1)L(Y_2 Y_1) + (-0.5)L(X_3 X_2) + (-0.25)L(Z_4 Z_3)>num_qubits を使って、空の可能性のある入力を曖昧さをなくす:
>>> PauliLindbladMap.from_list([], num_qubits=10)
<PauliLindbladMap with 0 terms on 10 qubits: 0.0>このメソッドは from_sparse_list() を呼び出すのと同じである:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> rates = [1.5, 2.0, -0.5]
>>> from_list = PauliLindbladMap.from_list(list(zip(labels, rates)))
>>> from_sparse_list = PauliLindbladMap.from_sparse_list([
... (label, (3, 2, 1, 0), rate)
... for label, rate in zip(labels, rates)
... ])
>>> assert from_list == from_sparse_list明示的な同一性を持たず、各単一量子ビット生成項が適用される量子ビットを明示的にリストしたラベルのリストから写像を構成する。
from_sparse_list
static from_sparse_list(iter, /, num_qubits)
ラベルのリスト、各項目が適用される量子ビット、項全体のレートからパウリ・リンドブラッド写像を構築する。
これは SparsePauliOp.from_sparse_list().
トリプルの "labels "フィールドと "indices "フィールドは、ジップすることで関連付けられる。 たとえば、これは from_list() の呼び出しは、各トリプルの "indices" フィールドを (num_qubits-1, ..., 1, 0) に設定することで、このメソッドで使用される形式に変換できることを意味します。
パラメーター
- iter (list[tuple[str, Sequence[int], float]]) – ラベルのトリプル、各単一量子ビット項が適用される量子ビット、項全体のレート。
- num_qubits (int) – マップが作用する量子ビットの数。
例
簡単な地図を作る:
>>> PauliLindbladMap.from_sparse_list(
... [("ZX", (1, 4), 1.0), ("YY", (0, 3), 2)],
... num_qubits=5,
... )
<PauliLindbladMap with 2 terms on 5 qubits: (1)L(X_4 Z_1) + (2)L(Y_3 Y_0)>この方法は from_list()トリプルのqubit-argumentsフィールドが減少する整数に設定されている場合:
>>> labels = ["XYXZ", "YYZZ", "XYXZ"]
>>> rates = [1.5, 2.0, -0.5]
>>> from_list = PauliLindbladMap.from_list(list(zip(labels, rates)))
>>> from_sparse_list = PauliLindbladMap.from_sparse_list([
... (label, (3, 2, 1, 0), rate)
... for label, rate in zip(labels, rates)
... ])
>>> assert from_list == from_sparse_listこの方法の逆。
from_terms
static from_terms(obj, /, num_qubits=None)
を構築する。 PauliLindbladMap を構成する。
すべての項は同じ数の量子ビットを持たなければならない。 指定された場合、 num_qubits 引数は条件と一致しなければならない。
地図作成の一部として単純化は行われない。
パラメーター
- obj (Iterable[Term]) – マップジェネレーターを作成するための、個々の用語の反復可能。
- num_qubits (int | None) – マップが作用する量子ビットの数。 これは通常、入力から推測されるが、イテーブルが空の場合を処理するために明示的に指定することもできる。
戻り値
対応する地図。
gamma
gamma()
地図の 。
generators
generators()
マップのジェネレーターを取得します。
これは の別名であり get_qubit_sparse_pauli_list_copy()、Aer や Runtime で同様のクラスに使用されている命名規則に沿った、より使いやすい名前を提供します。
戻り値
地図生成ツールの利用規約の写し。
戻りの型
get_qubit_sparse_pauli_list_copy
get_qubit_sparse_pauli_list_copy()
マップのqubit sparse pauliリストのコピーを取得する。
identity
static identity(num_qubits)
与えられた数の量子ビットのIDマップを取得する。
同一性マップは生成項を含まず、2つのインスタンスの合成のための同一性要素である。 PauliLindbladMap 同一性マップと合成されたものはそれ自身に等しい。
例
100量子ビットのIDマップを得る:
>>> PauliLindbladMap.identity(100)
<PauliLindbladMap with 0 terms on 100 qubits: 0.0>inverse
inverse()
を返す。 PauliLindbladMap を返す。
keep_paulis
keep_paulis(indices)
すべてのパウリを指定された指数に保ち、それ以外はすべて取り除く。
これは PauliLindbladMap.drop_paulis() を使うのと同じである。
パラメーター
indices (Sequence[int]) – ポーリスが保持しなければならない指標。
戻り値
新しいパウリ・リンドブラッド地図は、与えられたインデックス上のすべてのパウリを残し、それ以外のすべてのパウリを取り除いたものである。
例
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_paulis([0, 3])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("IXIII", 2.0), ("IIIIZ", 0.5), ("IIIIY", -0.25)])keep_qubits
keep_qubits(indices)
すべての量子ビットを指定されたインデックスに保持し、他のすべての量子ビットをトレースアウトする。
これは PauliLindbladMap.drop_qubits() を使うのと同じである。
パラメーター
indices (Sequence[int]) – 量子ビットを保持しなければならないインデックス。
戻り値
新しいパウリ・リンドブラッド写像では、与えられたインデックス上のすべての量子ビットが保持され、他のすべての量子ビットがトレースされている。
例
>>> pauli_map_in = PauliLindbladMap.from_list([("XXIZI", 2.0), ("IIIYZ", 0.5), ("ZIIXY", -0.25)])
>>> pauli_map_out = pauli_map_in.keep_qubits([0, 3])
>>> assert pauli_map_out == PauliLindbladMap.from_list([("XI", 2.0), ("IZ", 0.5), ("IY", -0.25)])parity_sample
parity_sample(num_samples, seed=None, scale=None, local_scale=None)
マップから符号とパウリ演算子のペアをサンプル。
各記号はブール値で表され、 が True を -1、 が False を表す +1。
クラスレベルの文書で与えられている準確率表現が与えられれば、各サンプルは以下のプロセスで抽選される:
- 符号ブール値を初期化する。
QubitSparsePauliインスタンスを identity 演算子に初期化する。 - マップ内の各パウリを繰り返し処理する。 各オペレーターに関連する擬似確率を使って、オペレーターを適用するかしないかをランダムに選択する。
- 演算子が適用されている場合は、 :class`QubitSparsePauli` をパウリと掛け合わせて更新する。 パウリに関連するレートが負の場合、符号のブール値を反転させる。
結果は 1d ブーリアンの配列として返され、対応するサンプリングされた量子ビットのスパースポーリスは QubitSparsePauliList.
引数 scale および local_scale を使用することで、現在のインスタンスを変更したり新しいインスタンスを作成したりすることなく、サンプリングプロセスで使用される基礎となるレートを変更できます。 引 scale 数はすべてのレートを固定浮動小数点数でスケーリングし、 local_scale 項ごとにレートをスケーリングする。
パラメーター
- num_samples (int) – サンプルの数。
- seed (int) – ランダムシード。
- scale (float) – すべてのレートに適用するスケール。
- local_scale (list[float]) – 学期ごとに適用するローカルスケール。
戻り値
符号のブーリアン配列と量子ビット・スパース・パウリのリスト。
戻りの型
符号、qubit_sparse_pauli_list
pauli_fidelity
pauli_fidelity(qubit_sparse_pauli)
この写像のパウリ忠実度を量子ビットスパースパウリについて計算する。
パウリ の場合、パウリ・リンドブラッド写像 に関する忠実度は実数 であり、 . I.e. すべてのパウリは線形写像 の固有ベクトルであり、忠実度は対応する固有値である。 生成集合 とレート関数 を持つパウリ・リンドブラッド写像の場合、パウリ忠実度は数学的に次のようになる
ここで、 は、 と がコミュートしている場合は 、アンチコミュートしている場合は となる。
Args: qubit_sparse_pauli ( QubitSparsePauli ): qubit sparse Pauli to compute Pauli
の忠実さ。
probabilities
probabilities()
地図の確率 を計算する。 これらは各発生器が適用されない確率として解釈でき、各リンドブラッド率の符号とは独立であると定義される。
sample
sample(num_samples, seed=None)
純粋に非負の率を持つ例 PauliLindbladMap に対して、写像からパウリ演算子をサンプリングする。 マップに負のレートが含まれる場合、を使用する PauliLindbladMap.parity_sample()。
クラスレベルの文書で与えられている準確率表現が与えられれば、各サンプルは以下のプロセスで抽選される:
- :class`~.QubitSparsePauli` インスタンスを ID 演算子に初期化する。
- マップ内の各パウリを繰り返し処理する。 各オペレーターに関連する擬似確率を使って、オペレーターを適用するかしないかをランダムに選択する。
- 演算子が適用されている場合は、 :class`QubitSparsePauli` をパウリと掛け合わせて更新する。
サンプリングされたqubit sparse Paulisは、以下の形式で返される。 QubitSparsePauliList.
パラメーター
戻り値
量子ビット・スパース・パウリのリスト。
戻りの型
qubit_sparse_pauli_list
レイズ
ValueError - マップ内のレートがマイナスの場合。
scale_rates
signed_sample
signed_sample(num_samples, seed=None)
マップからのサンプル符号とパウリ演算子のペア このメソッドにおけるブール値の符号付け規則は非標準であることに注意してください。 この種のサンプリングに推奨される方法はであり PauliLindbladMap.parity_sample()、より多くの機能を備えている。
各符号はブール値で表され、 True は +1 を、 False は -1 を表す。
クラスレベルの文書で与えられている準確率表現が与えられれば、各サンプルは以下のプロセスで抽選される:
- 符号ブール値を初期化する。
QubitSparsePauliインスタンスを identity 演算子に初期化する。 - マップ内の各パウリを繰り返し処理する。 各オペレーターに関連する擬似確率を使って、オペレーターを適用するかしないかをランダムに選択する。
- 演算子が適用されている場合は、 :class`QubitSparsePauli` をパウリと掛け合わせて更新する。 パウリに関連するレートが負の場合、符号のブール値を反転させる。
結果は 1d ブーリアンの配列として返され、対応するサンプリングされた量子ビットのスパースポーリスは QubitSparsePauliList.
パラメーター
戻り値
符号のブーリアン配列と量子ビット・スパース・パウリのリスト。
戻りの型
符号、qubit_sparse_pauli_list
simplify
simplify(tol=1e-08)
生成式内の同類項をすべて和算し、その結果得られる比の絶対値がゼロの許容誤差範囲内にある場合は、それらを除去する。 また、これにより、パウリ演算子が単位演算子に比例する項も除去される。なぜなら、それに対応する生成元は実際にはゼロ写像だからである。
副次的な効果として、これはジェネレーターを固定の正準順にソートする。
これを等価比較に使用する際は、浮動小数点の丸め誤差や加算の非結合性により、和の各項の係数がゼロでない場合、それらが不等と判定される可能性があることに注意してください。 許容誤差の範囲内で2つの観測量を比較するには、それらの観測量の正規化された差を0と比較するのが最も確実である。
パラメーター
tol (float) – 同じような項を合計した後、絶対値が与えられた絶対許容誤差より小さいレートは、出力から抑制される。
例
を使用する。 simplify() を使用すると、同じマップを表す2つの演算子を比較することができますが、デフォルトでは構造テストのために不等な比較になります:
>>> base = PauliLindbladMap.from_sparse_list([
... ("XZ", (2, 1), 1e-10), # value too small
... ("XX", (3, 1), 2),
... ("XX", (3, 1), 2), # can be combined with the above
... ("ZZ", (3, 1), 0.5), # out of order compared to `expected`
... ], num_qubits=5)
>>> expected = PauliLindbladMap.from_list([("IZIZI", 0.5), ("IXIXI", 4)])
>>> assert base != expected # non-canonical comparison
>>> assert base.simplify() == expected.simplify()上記の例では、すべての浮動小数点計算が正確になるように係数が選択されており、中間的な丸めや連想性の懸念がないことに注意してください。 これが保証されない場合は、より安全な形がある:
>>> left = PauliLindbladMap.from_list([("XYZ", 1.0/3.0)] * 3) # sums to 1.0
>>> right = PauliLindbladMap.from_list([("XYZ", 1.0/7.0)] * 7) # doesn't sum to 1.0
>>> assert left.simplify() != right.simplify()
>>> assert left.compose(right.inverse()).simplify() == PauliLindbladMap.identity(left.num_qubits)to_sparse_list
to_sparse_list()
マップをスパースリスト形式で表現する。
の逆演算と見なすことができる。 PauliLindbladMap.from_sparse_list()しかし、スパース・リストへの往復の後では、項の順序が同じであることは保証されない。
例
>>> pauli_lindblad_map = PauliLindbladMap.from_list([("IIXIZ", 2), ("IIZIX", 3)])
>>> reconstructed = PauliLindbladMap.from_sparse_list(pauli_lindblad_map.to_sparse_list(), pauli_lindblad_map.num_qubits)これらのリストを解釈できるコンストラクタ。