QubitConverter 移行ガイド#
QubitConverter
クラスは、Qiskit Nature バージョン 0.6で非推奨になりました。 QubitMapper
クラスをラップする代わりに、このクラスを直接使用できるようになります。 これをサポートするために、マッパーが改良され、さらなる拡張機能が使用できるようになっています。
このガイドをシンプルにするために、QubitConverter
の特定のユースケースを置き換える方法例に焦点を当てます。 マッパーの詳細については、 量子ビット・マッパーのチュートリアル を参照してください。
セットアップ#
このガイドの例では、常に次の FermionicOp
を使用します。
from qiskit_nature.second_q.drivers import PySCFDriver
driver = PySCFDriver(atom="H 0 0 0; H 0 0 0.735")
problem = driver.run()
hamiltonian = problem.hamiltonian.second_q_op()
for label, coeff in sorted(hamiltonian.items()):
print(f"{coeff:+.8f} * '{label}'")
+0.33785508 * '+_0 +_0 -_0 -_0'
+0.09046560 * '+_0 +_0 -_1 -_1'
+0.09046560 * '+_0 +_1 -_0 -_1'
+0.33229087 * '+_0 +_1 -_1 -_0'
+0.33785508 * '+_0 +_2 -_2 -_0'
+0.09046560 * '+_0 +_2 -_3 -_1'
+0.09046560 * '+_0 +_3 -_2 -_1'
+0.33229087 * '+_0 +_3 -_3 -_0'
-1.25633907 * '+_0 -_0'
+0.33229087 * '+_1 +_0 -_0 -_1'
+0.09046560 * '+_1 +_0 -_1 -_0'
+0.09046560 * '+_1 +_1 -_0 -_0'
+0.34928686 * '+_1 +_1 -_1 -_1'
+0.33229087 * '+_1 +_2 -_2 -_1'
+0.09046560 * '+_1 +_2 -_3 -_0'
+0.09046560 * '+_1 +_3 -_2 -_0'
+0.34928686 * '+_1 +_3 -_3 -_1'
-0.47189601 * '+_1 -_1'
+0.33785508 * '+_2 +_0 -_0 -_2'
+0.09046560 * '+_2 +_0 -_1 -_3'
+0.09046560 * '+_2 +_1 -_0 -_3'
+0.33229087 * '+_2 +_1 -_1 -_2'
+0.33785508 * '+_2 +_2 -_2 -_2'
+0.09046560 * '+_2 +_2 -_3 -_3'
+0.09046560 * '+_2 +_3 -_2 -_3'
+0.33229087 * '+_2 +_3 -_3 -_2'
-1.25633907 * '+_2 -_2'
+0.33229087 * '+_3 +_0 -_0 -_3'
+0.09046560 * '+_3 +_0 -_1 -_2'
+0.09046560 * '+_3 +_1 -_0 -_2'
+0.34928686 * '+_3 +_1 -_1 -_3'
+0.33229087 * '+_3 +_2 -_2 -_3'
+0.09046560 * '+_3 +_2 -_3 -_2'
+0.09046560 * '+_3 +_3 -_2 -_2'
+0.34928686 * '+_3 +_3 -_3 -_3'
-0.47189601 * '+_3 -_3'
PauliSumOp 対 SparsePauliOp#
もう 1 つの注記 : qiskit.opflow
モジュールは、将来非推奨になる予定です。 PauliSumOp
クラスと、広範囲に使用されている qiskit.quantum_info
モジュールと SparsePauliOp
から移行するために、 use_pauli_sum_op
の値を False
に設定することができます。 これは後のリリースではデフォルトになる予定です。
SparsePauliOp
をこのガイドの以降の部分で一貫して使用できるようにするために、以下の設定を適用します:
from qiskit_nature import settings
settings.use_pauli_sum_op = False
今後非推奨となるため、Qiskit Natureは以前 PauliSumOp
オブジェクトが許されていたすべての場所で SparsePauliOp
インスタンスの使用をサポートしています。これを活用するため、上記の設定を変えることは必要では ありません 。 SparsePauliOp
を使うよう変更することを推奨しています。
qiskit.opflow
非推奨の詳細については、 マイグレーション・ガイド を参照してください。
最も簡単なケース#
最も簡単なケースでは、 QubitMapper
オブジェクトを QubitConverter
に渡しました。例えば、次のようになります。
from qiskit_nature.second_q.mappers import JordanWignerMapper, QubitConverter
mapper = JordanWignerMapper()
converter = QubitConverter(mapper)
コードを更新するために必要なことは、それをやめ、単に上記の例の mapper
オブジェクトを以前使用していたどちらかの場所に渡すことです。
SparseLabelOp
を直接使用している場合は以下のようにします:
qubit_op = converter.convert(hamiltonian)
for pauli, coeff in sorted(qubit_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-0.81054798 * IIII
+0.17218393 * IIIZ
-0.22575349 * IIZI
+0.12091263 * IIZZ
+0.17218393 * IZII
+0.16892754 * IZIZ
+0.16614543 * IZZI
+0.04523280 * XXXX
+0.04523280 * XXYY
+0.04523280 * YYXX
+0.04523280 * YYYY
-0.22575349 * ZIII
+0.16614543 * ZIIZ
+0.17464343 * ZIZI
+0.12091263 * ZZII
ここでもう一度 mapper
を使用する必要がありますが、そのメソッドは .map
と呼ばれます。
qubit_op = mapper.map(hamiltonian)
for pauli, coeff in sorted(qubit_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-0.81054798 * IIII
+0.17218393 * IIIZ
-0.22575349 * IIZI
+0.12091263 * IIZZ
+0.17218393 * IZII
+0.16892754 * IZIZ
+0.16614543 * IZZI
+0.04523280 * XXXX
+0.04523280 * XXYY
+0.04523280 * YYXX
+0.04523280 * YYYY
-0.22575349 * ZIII
+0.16614543 * ZIIZ
+0.17464343 * ZIZI
+0.12091263 * ZZII
これは、以下のマッパーのいずれかを使用して作業していたときに、実行していたことです。
パリティ・マッピング#
しかし、 ParityMapper
を使用している場合は、 QubitConverter
の two_qubit_reduction=True
オプションを使用することができました。 ParityMapper
にユニークなこの機能は、現在直接マッパーに組み込まれています。 もしあなたがこれらの方法に沿って何かをしている場合は:
from qiskit_nature.second_q.mappers import ParityMapper
converter = QubitConverter(ParityMapper(), two_qubit_reduction=True)
reduced_op = converter.convert(hamiltonian, num_particles=problem.num_particles)
for pauli, coeff in sorted(reduced_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-1.05237325 * II
+0.39793742 * IZ
+0.18093120 * XX
-0.39793742 * ZI
-0.01128010 * ZZ
同等のコードは次のようになります。
mapper = ParityMapper(num_particles=problem.num_particles)
reduced_op = mapper.map(hamiltonian)
for pauli, coeff in sorted(reduced_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-1.05237325 * II
+0.39793742 * IZ
+0.18093120 * XX
-0.39793742 * ZI
-0.01128010 * ZZ
Z2Symmetries#
ついに QubitConverter
クラスも、 qiskit.opflow
モジュール内に実装された Z2Symmetries
を利用することで、量子ビット・リソースのさらなる削減をサポートしました。 qiskit.quantum_info
モジュール ( Z2Symmetries
と同じ名前を持ちます) の更新された実装をサポートするため非推奨クラスを拡張しましたが、今は新しい TaperedQubitMapper
クラスを代わりに使用すべきです。
以前は、以下のように有効化にしていました:
mapper = JordanWignerMapper()
converter = QubitConverter(mapper, z2symmetry_reduction="auto")
後に ElectronicStructureProblem()
クラスでのみサポートされています。以下に、簡単な例を示します:
tapered_op = converter.convert(
hamiltonian,
num_particles=problem.num_particles,
sector_locator=problem.symmetry_sector_locator,
)
for pauli, coeff in sorted(tapered_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-1.04109314 * I
+0.18093120 * X
-0.79587485 * Z
次に必要なのは、 get_tapered_mapper()
メソッドを使用し、ラップしたい元のマッパーを提供することだけです:
tapered_mapper = problem.get_tapered_mapper(mapper)
tapered_op = tapered_mapper.map(hamiltonian)
for pauli, coeff in sorted(tapered_op.label_iter()):
print(f"{coeff.real:+.8f} * {pauli}")
-1.04109314 * I
+0.18093120 * X
-0.79587485 * Z
自動対称性検出を使用しておらず、代わりにカスタム対称性セクターを指定した場合は、 TaperedQubitMapper
をインスタンスを直接構築できます。 詳細については、必ずそのドキュメンテーションを確認してください。