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 を使用している場合は、 QubitConvertertwo_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 をインスタンスを直接構築できます。 詳細については、必ずそのドキュメンテーションを確認してください。